Dateien in die Ausführbare Datei einbinden und exrahieren (Recourcensystem)
-
Hallo,
ich stehe gerade vor dem Problem eine Datei mithilfe des Recoucensystems in die Ausführbare Datei (.exe) meines Programms einzubinden und diese wärend der Laufzeit wieder als Datei extrahieren. Bis jetzt habe ich nur Icons mit dem Recoucensystem eingebunden und habe somit noch nicht viel Erfahrung. Ich hoffe ihr könnt mir helfen.

Mfg
Alpha_Coder
-
dafür legst Du einfach eine *.RC Resourcedatei an (Textdatei) in der Du auf externe Dateien verweist. Dann im Projekt aufnehmen und die RC Datei wird comiliert und gelinkt.
100 RT_RCDATA DISCARDABLE "Bindaten.bin" 100 BITMAP DISCARDABLE "images\\bild1.bmp" 101 BITMAP DISCARDABLE "images\\bild2.bmp" 100 CURSOR DISCARDABLE "Cursor\\cur100.cur" oder auch direkt Binärdaten ablegen: 101 RT_RCDATA DISCARDABLE { 0x0102, 0x0304, 0x0506, 0x0708, 0x090A } oder auch ein externes Manifest: 1 24 "myApp.manifest"Zugriff aus dem Programm dann mit den gängigen WinAPI Funktionen wie
FindResourceEx(), LoadResource(), etc.
-
Vielen Dank. Ich werde es gleich mal ausprobieren.

Mfg Alpha_Coder
-
Dankeschön. Es funktioniert die Recouce einzubinden und zu landen. Aber wie kann ich diese nun verwenden? Der Rückgabetyp von von LoadResource() ist HGLOBAL. Wie kann ich diese Resouce nun z.B. in eine Datei schreiben oder ausgeben?

Mfg
Alpha_Coder
-
Schau dir einmal den Returnwert von LockResource (*) an.
Edit: und SizeOfResource
-
Dankeschön. Mit den Funktionen LockResource() und SizeofResource() kann ich einen void Zeiger auf das erste Byte und die Anzahl der Bytes ermitteln. Aber wie schaffe ich es mithilfe des void Zeigers die Daten zum Beispiel in ein char array abzulegen?

PS:Ich weiß, dass das Grundwissen von C ist(void Zeiger), aber ich benutze hauptsächlich C++ und kenne mich mit void Zeigern nicht aus.Mfg
Alpha_Coder
-
Habe ich die Frage zu undeutlich verfasst?
Also:
ich bekomme als Rückgabe von der Funktion LockResource() einen void Zeiger auf das erste Byte der Resource.
Mit SizeofResource () kann ich die Anzahl der Bytes ermitteln.Frage:
Wie schaffe ich es nun die Resouce z.B in eine Datei zu schreiben(als c string)?
Ich hoffe ihr könnt mir helfen.

Mfg
Alpha_Coder
-
void *ptr = LockResource(...
char *cPtr = (char*) ptr;
oder gleich:
char *ptr = (char*) LockResource(...
-
Alpha_Coder schrieb:
PS:Ich weiß, dass das Grundwissen von C ist(void Zeiger), aber ich benutze hauptsächlich C++ und kenne mich mit void Zeigern nicht aus.
ne, nicht C++ sondern MicroSchrott, wenn Du Klassen wie CString mit C++ gleichsetzt. Das ist leider das Problem, da viele überhaupt nicht wissen, was sie da eigentlich machen. Nicht persönlich nehmen, diese Resource Geschichten muss man nicht wissen. Aber wenn ich hier so manch andere Frage lese, stellen sich mir die Nackenhaare auf

Wenn Du eine Datei als Resource eingebunden hast und auch 1:1 wieder speichern willst, dann ist es doch egal was da drin steht. Du hast den Zeiger auf die Daten und Größe. Also einfach mit CreateFile() die Datei erzeugen und dann WriteFile() den Inhalt aus dem Buffer schreiben.
void* pBuffer = LockResource(); DWORD dwSize = SizeofResource(); HANDLE hFile = CreateFile(); WriteFile(hFile, pBuffer, dwSize, ...); CloseHandle(hFile);Das LockResource ist ein Win31/W95 Relikt. Ich glaube Du kannst das HGLOBAL auch direkt zu void* casten (bin mir da aber im Moment nicht ganz sicher).
-
Vielen Dank für die ausführliche Antwort!

Du hast mir damit sehr geholfen. Dankeschön.

Mfg
Alpha_Coder
PS: Qualität vor Quantität
