MSVC++ 6.0 - DLL in EXE einbetten?
-
Hi!
Ist es irgendwie moeglich (aehnlich wie C#) eine DLL Datei als embedded resource direkt in eine exe zu packen und so nur eine Datei weiterzugeben?
-
Klar kannst Du die DLL als Resource einbinden. Du kannst alles als Resource-Enbinden was Du willst!
Ach so, Du willst die DLL auch noch verwenden? Ne, dass geht offiziell nicht direkt. Da musst Du die Ressource dann in eine Datei schreiben und laden; dann geht es (In-Memory-Assemblies in .NET gibt es in Win32 nicht).
-
Bleibt wie immer meine freche Frage: Warum eigentlich so etwas?
-
Die Frage 'warum' laesst sich einfach beantworten. Mein projekt ist eine modifizierte Version eines Servers, der zusammen mit einer dll arbeitet. So, nun ist unsere DLL jedoch leicht veraendert (via hex editor..) und muss mit der exe zusammen in einem verzeichnis sein, da es bei der alten DLL zu abstuerzen kommt. Leider aber sind viele User nicht in der Lage die DLL, die mit der Exe in einer ZIP datei kommt in das verzeichnis zu legen und fragen dauernd an, warum der server bei ihnen crasht - ich wollte mir den aerger einfach ersparen (ohne ein installationsprogramm zu nutzen). ;0)
-
Da Du sowieso explitzit die DLL lädst kannst Du auch deren Version und Funktionsweise prüfen oder? Es dürfte ja nicht schwer sein auch die Version zu patchen?
Dann muss Dein Programm nicht crashen. Ich finde es Overkill das Hauptprogramm unnötig größer zu machen nur damit die DLL ausgestreamt wird!
Unter Vista fällst Du damit sowieso auf die Nase. Du kannst nicht in das C:\Programme Verzeichnis schreiben im normalenm Kontext!
Lass es bleiben. Verifiziere besser die Version die notwendig ist.
-
Hm, das mit dem Patch gefaellt mir.. das gefaellt mir sogar sehr - danke :0)
-
Genau dieses Problem habe ich letzte Woche gelösst:
bool MyClass::ExtractDLL() { wchar_t wsTempPath[MAX_PATH]=L""; HANDLE hHnd=0; wstring wExtractPath=L""; unsigned long lBytesWritten=0; if (GetTempPathW(MAX_PATH, wsTempPath)) { wExtractPath = wsTempPath + "MyDll.dll"; HRSRC zfile = FindResourceW(GetModuleHandle(0), MAKEINTRESOURCEW(IDR_BIN1), L"BIN"); if (zfile) { HGLOBAL zload = LoadResource(GetModuleHandle(0), zfile); void *data = LockResource(zload); size_t sz = SizeofResource(GetModuleHandle(0), zfile); hHnd = CreateFileW(wExtractPath.c_str(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ); if (hHnd) { if (WriteFile(hHnd, data, sz, &lBytesWritten, 0)) { // Success: CloseHandle(hHnd); m_wsDllPath = wExtractPath; return true; } } } } // Failure: m_wsDllPath = L""; return false; }IDR_BIN1 ist der Identifier aus dem Ressourcen Editor nachdem man seine DLL als Custom "BIN" hinzugefügt hat. Die Klassen Variable m_wsDllPath enhält dann den Pfad wo die DLL liegt.
Ich habe den Source aus dem Internet. Wenn Du Fragen hast schreib nochmal, bin bis 18 Uhr hier.
-
Hm, das mit dem schreiben werde ich mal versuchen, wie auch das patchen.. aber sagt mal - wie ist das mit dem statischen linken - geht dann nicht die DLL in der exe auf? Und wenn ja, waere das nicht eine moeglichkeit? (Vorallen wenn ja - wie geht das ueberhaupt o0)