Binär datei in exe Einbinden und später "erzeugen"



  • Hallo,

    Ich möchte gerne eine binär datei in meine EXE einbinden (nicht komprimiert) und dann später wenn jemand es öffnet, eine dateianlegen und dort den inhalt der binär datei einfügen!

    Es ist ein kleiner Installer für Maps für ein Game 🙂

    Nur komm ich nicht weiter 😞



  • Afaik geht das nicht weil man keinen Zugriff auf den Inhalt der exe bekommt wenn sie verwendet (also ausgeführt wird). So ein System ist auch unüblich, normalerweise liegen die zu installierenden Daten gepackt in seperaten Dateien vor und werden von der setup.exe extrahiert.



  • Hallo,

    Wenn ich die Dateien hinzulege, kann er sie ja auch selber ins Map verzeichnis legen!

    Kann man die daten nicht einfach in ner variable speichern dann datei anlegen und per cout reinschreiben?



  • Natürlich kann man das aber wieso sollte man das machen?

    Ob du nun gleich die Dateien packst / seperat mit der setup.exe auslieferst und sie werden dann in ein Verzeichnis von setup.exe kopiert

    oder

    ob du setup.exe dateien erstellen lässt, dort was reinkopierst, sie dann von setup.exe in ein verzeichnis kopierst

    da ist schon ein unterschied und ich würde erstere variante nehmen, weil sie sinnvoller ist.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • das ist doch nicht schwer, du packst die Binär Datei so in dein Programm. Um Binär Dateien so zu verpacken gibt es eine Menge kleinerer Tools oder es lässt sich schnell schreiben

    #include <fstream>
    
    const char *const binary={ 0xFF, 0xFF ... };
    const size_t binary_size=2;
    
    int main() {
      std::ofstream datei("demo.bin",ios::binary);
      datei.write(binary,binary_size);
      //...
    }
    


  • Oder unter Windows einfach als (Binär-) Ressource drangehangen, wo Du auch Bitmaps und Icons hinballerst.



  • kingruedi schrieb:

    das ist doch nicht schwer, du packst die Binär Datei so in dein Programm. Um Binär Dateien so zu verpacken gibt es eine Menge kleinerer Tools oder es lässt sich schnell schreiben

    #include <fstream>
    
    const char *const binary={ 0xFF, 0xFF ... };
    const size_t binary_size=2;
    
    int main() {
      std::ofstream datei("demo.bin",ios::binary);
      datei.write(binary,binary_size);
      //...
    }
    

    Hallo,

    Das hilft mir schonma!

    Aber: Wie bekomme ich denn die Daten in die Variable? Gibbet ne funktion zum auslesen, das schreibts mir dann in ne datei und das muss ich denn bei ={ [...] } einfügen?

    Danke für die Hilfe 🙂

    Es geht darum das ich einfach aus 1 Datei die man in ein subdir kopieren muss einfach 1 .exe macht die das automatisch macht 🙂



  • Weißt du was Ressourcen sind?
    Als Ressource einbinden:
    Meinbinaryzeug BINTYPE DISCARDABLE "Meinbinaryzeug.dat"

    Und im Code so abrufen:
    hRes = LoadResource(hInstance,FindResource(hInstance,TEXT("Meinbinaryzeug"),TEXT("BINTYPE")));
    hResData = (void*)LockResource(hRes);
    hFile = CreateFile(TEXT("Meinbinaryzeug_fertig.muh"),GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,hResData,SizeofResource(hInstance,FindResource(hInstance,TEXT("Meinbinaryzeug"),TEXT("BINTYPE"))),&dwWritten,NULL);
    CloseHandle(hFile);
    FreeResource(hRes);

    Die binären Daten kann man natürlich auch direkt in den Programmcode einbinden, wie kingruedi es vorschlägt, das ist aber ... naja ... muss ich nicht wirklich für größere Daten jetzt bewerten, oder?
    Ich hab das aber auch einmal gemacht - hab mir dazu ein Programm geschrieben, welches die Daten einliest und in ne Textdatei dann als Array ausgibt. Dann nur noch via Copy&Paste in den Quellcode einfügen. Aber wie gesagt ... halte ich nicht gerade für vernünftig, wenn die Daten größer sind.



  • sarfuan schrieb:

    Weißt du was Ressourcen sind?
    Als Ressource einbinden:
    Meinbinaryzeug BINTYPE DISCARDABLE "Meinbinaryzeug.dat"

    Und im Code so abrufen:
    hRes = LoadResource(hInstance,FindResource(hInstance,TEXT("Meinbinaryzeug"),TEXT("BINTYPE")));
    hResData = (void*)LockResource(hRes);
    hFile = CreateFile(TEXT("Meinbinaryzeug_fertig.muh"),GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,hResData,SizeofResource(hInstance,FindResource(hInstance,TEXT("Meinbinaryzeug"),TEXT("BINTYPE"))),&dwWritten,NULL);
    CloseHandle(hFile);
    FreeResource(hRes);

    Supi! Danke 🙂

    Nur 1 Problem bei meinem Compiler: Dev-C++ 4.9.9.0

    Der legt zwar ne .rc file an, aber er tut sie immer überschreiben wenn ich das da einfüge! Kann mir da evtl. noch jemand helfen?

    (Ich weiß, bissl OT)



  • Du kannst die Daten auch in die EXE schreiben und dann wieder rausnehmen.. ist gar nicht so schwer... ich hab das auch gemacht.. man muss nur dann noch ne liste erstellen wie gross eine datei ist und wie sie heisst..
    ich kann dir code schicken wen du ihn willst

    MFG Burnner



  • Cibiy schrieb:

    Der legt zwar ne .rc file an, aber er tut sie immer überschreiben wenn ich das da einfüge! Kann mir da evtl. noch jemand helfen?

    Du kannst auch selbst *.rc-Dateien anlegen und dem Projekt hinzufügen 😉



  • Hallo,

    Okay, das mit dem .rc file geht jetzt! Nur Probleme:

    9 /home/cibiy/main.cpp `hRes' undeclared (first use this function)

    etc.



  • Hallo,

    Kann mir keiner helfen :(?



  • Cibiy schrieb:

    Hallo,

    Okay, das mit dem .rc file geht jetzt! Nur Probleme:

    9 /home/cibiy/main.cpp `hRes' undeclared (first use this function)

    etc.

    /home/ciby? hört sich nach Unix/Linux an, dann gibt es keine Resourcen. Aber siehe mal hier http://www.programmersheaven.com/zone3/cat156/17063.htm



  • Hätte jetzt genau so nen Tool wie Kingruedi gepostet hat vorgeschlagen so isses plattformunabhängig 🙂

    Könntest dir natürlich auch selbst basteln ist ja nicht viel mehr als jedes Byte einlesen und in Form eines Hexcodes in die Datei zu schreiben.



  • ja, müselig ist das nicht und du könntest dir sogar noch eine Kompression einbauen.


Anmelden zum Antworten