Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...