Gateway_man Geschrieben 30. Juli 2013 Geschrieben 30. Juli 2013 Hallo liebe leute, ich versuche seit längerem an die typelib ranzukommen, die an jeder ActiveX/Com Library dranhängt. Diese befindet sich als Resource in der Library. An sich sah eigentlich alles recht gut aus. Er findet die Resource, lädt diese und schreibt diese auch weg. Man kann diese dann auch über LoadTypeLib laden. Ich bin eigentlich nur auf einen Fehler aufmerksam geworden, weil ich die extrahierte Typelib als Import in einer IDL benutzen wollte. MIDL hat bei der Interpretation dann einen "internen" Fehler festgestellt. Testweise hab ich dann mit einer externen Anwendung die Typelib aus der ocx gezogen und musste direkt feststellen, da diese 2KB kleiner war. Mit dieser extrahierten tlb ging das ganze dann auch wunderbar und idl interpreter hat keinen Fehler geworfen. Leider muss ich das auslesen selbst hinbekommen, da eine externe Anwendung nicht in Frage kommt. Könnt ihr euch mal den Code ansehn? Eventuell springt euch der Fehler direkt ins Gesicht . int _tmain(int argc, _TCHAR* argv[]) { vector<Argument> _arguments = QueueParameters(argc, argv); if (ArgumentExists(_arguments, "TlbExp")) { unsigned long size = 0; void* rcData = FCResource(GetValueByKey(_arguments, "Filename").c_str(),GetValueByKey(_arguments, "RCType").c_str(),GetValueByKey(_arguments, "RC").c_str(), size); if (rcData != 0) { fstream ifs; ifs.open(GetValueByKey(_arguments, "Output"), ios::in | ios::out | ios::trunc); ifs.write((char*)rcData, size); ifs.flush(); ifs.close(); delete[] rcData; } else { cout << "Type library export failed! Press any key..." << endl; cin.get(); } } return 0; } //Beispielaufruf FCResource(L"....\test.ocx", L"TYPELIB", 1, size); void* FCResource(LPCWSTR filename, LPCWSTR Type, WORD RC, unsigned long &rcSize) { BYTE* RCdata = 0; HMODULE modul = LoadLibrary(filename); if (modul != 0) { HRSRC rcInfo = FindResource(modul, MAKEINTRESOURCE(RC), Type); if (rcInfo != 0) { rcSize = SizeofResource(modul, rcInfo); HGLOBAL rcHandle = LoadResource(modul, rcInfo); LPVOID pFirstByte = LockResource(rcHandle); RCdata = new BYTE[rcSize]; memset(RCdata, 0 , rcSize); memcpy(RCdata, pFirstByte, rcSize); FreeResource(rcHandle); } else { cout << "Failed to load the resource. Couldn't find the specific resource!" << endl; } FreeLibrary(modul); } else { cout << "Failed to load the library. Couldn't find the specific library!" << endl; } return RCdata; } LG & Danke Gateway Zitieren
Klotzkopp Geschrieben 30. Juli 2013 Geschrieben 30. Juli 2013 Gib bei open das Flag ios::binary an, sonst werden beim Schreiben die Zeilenwechsel automatisch umgewandelt. Eigentlich solltest du gar nicht open benutzen, sondern die Parameter gleich dem Konstruktor übergeben. Und flush und close kannst du weglassen, darum kümmert sich der Stream-Destruktor. Zitieren
Gateway_man Geschrieben 31. Juli 2013 Autor Geschrieben 31. Juli 2013 Danke dir perfekt . Hat einwandfrei funktioniert und danke für den anderen Tipp. LG Gateway Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.