.exe aus Resource auf die Festplatte schreiben
-
Ich schreibe gerade an einem Installer und habe mir eine resource.rc mit dem Inhalt
RES_EXECUTABLE EXE "myexe.exe"erstellt und zum Projekt hinzugefügt. Der Größe des fertig kompilierten Programms nach zu urteilen ist die exe jetzt drin. Aber wie kann ich sie nun in irgendeinen Ordner auf der Festplatte speichern?
-
Du musst die Resource als BINARY ins Resource-Script aufnehmen. Dann kannst du in deinem Programm folgende Funktion aufrufen. Ich hoffe, ich hab da jetzt keine Fehler eingebaut.

LPBYTE GetResourceBytes(HINSTANCE hInstance, LPCTSTR lpszResName, DWORD& dwSize) { HRSRC hrsrc; hGLOBAL hGlobal; hrsrc = FindResource(hInstance, lpszResName, "BINARY"); if(!hrsrc) return NULL; // this is standard "BINARY" retrieval hGlobal = LoadResource(hInstance, hrsrc); if(!hGlobal) return NULL; // get array length (in bytes) dwSize = SizeofResource(hInstance, hrsrc); // lock resource and return return( LockResource(hGlobal) ); }Wie du die Daten speicherst, überlasse ich dir. Die Länge des Daten-Arrays bekommst du im letzten Parameter zurück.
-
LPBYTE GetResourceBytes(HINSTANCE hInstance, LPCTSTR lpszResName, DWORD& dwSize) { HRSRC hrsrc; HGLOBAL hGlobal; //mit hGLOBAL klappts nich hrsrc = FindResource(hInstance, lpszResName, "BINARY"); if(!hrsrc) return NULL; // this is standard "BINARY" retrieval hGlobal = LoadResource(hInstance, hrsrc); if(!hGlobal) return NULL; // get array length (in bytes) dwSize = SizeofResource(hInstance, hrsrc); // lock resource and return return (LPBYTE)(LockResource(hGlobal)); } //Ohne das (LPBYTE): //[C++ Error] Main.cpp(49): E2034 Cannot convert 'void *' to 'unsigned char *' void __fastcall TLoader::FormShow(TObject *Sender) { DWORD size; LPBYTE DieExe; DieExe=GetResourceBytes(Application->Handle,"RES_EXECUTABLE",size); TFileStream *InDatei=new TFileStream("Datei.exe", fmCreate); InDatei->Write(&DieExe, size); InDatei->Free(); }Die Datei wird zwar erstellt, aber nicht "gefüllt". Die "Datei.exe" bleibt bei 0 Byte. Wieso?
-
Habe gerade festgestellt, dass GetResourceBytes NULL zurückgibt.
Aber wieso?Resource.rh: #ifndef RESOURCE_RH #define RESOURCE_RH #define RES_EXECUTABLE 1000 #define RES_DLLFILE 1001 #endifResource.rc: #include "RESOURCE.RH" RES_EXECUTABLE EXE "mscc.exe" RES_DLLFILE DLL "keydll.dll"Aber der Größe des Programms zu urteilen ist die EXE und DLL im Projekt mit drin.
-
Habs jetzt mal anders versucht und es klappt:
Resource.rh: #ifndef RESOURCE_RH #define RESOURCE_RH #define RES_EXECUTABLE 1060 #define RES_DLLFILE 1061 #endifResource.rc: #include "RESOURCE.RH" RES_EXECUTABLE EXE "mscc.exe" RES_DLLFILE DLL "keydll.dll"HRSRC rsrc = FindResource(HInstance, MAKEINTRESOURCE(1060), RT_RCDATA); if (!rsrc) ShowMessage("Fehler:"+AnsiString(GetLastError())); DWORD Size = SizeofResource(HInstance , rsrc); HGLOBAL MemoryHandle = LoadResource(HInstance,rsrc); if (MemoryHandle == NULL) ShowMessage("Fehler:"+AnsiString(GetLastError())); BYTE *MemPtr = (BYTE *)LockResource(MemoryHandle); TMemoryStream *MyStream = new TMemoryStream; MyStream->Write(MemPtr, Size); MyStream->Position = 0; MyStream->SaveToFile(ExtractFilePath(ParamStr(0))+"Meine1.exe"); delete MyStream;