Zum Inhalt springen

[C++] Auslesen der TypeLib (Resourcen)


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...