Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C++] Auslesen der TypeLib (Resourcen)

Empfohlene Antworten

Veröffentlicht

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.