Recourcen aus der exe Extrahieren



  • Hi!

    Ich habe ein Programm geschrieben, wofür man einen bestimmten treiber braucht, der erst installiert werden muss. Das will ich so machen, das der Anwender nur auf einen Button drücken muss und sofort die als recource importierte install.exe extrahiert und gestartet wird.

    Erst dachte ich das geht mit:
    CopyFile("Install.exe","C:\\WINDOWS\\TEMP\\install.exe",FALSE);

    Aber falsch! Damit kopiere ich nur die datei "install.exe" in den TEMP ordner, wenn sie sich im selben Ordner wie die exe befindet 😞

    hat jemand ne idee bzw lösung?



  • Also, erstmal würde ich dir empfehlen, die EXE als zusätzliche Datei mitzuliefern und nicht als Resource. Das macht IMHO ein wenig zu viel Aufwand. Und warum soll der User diese Datei nicht sehen?
    Zur Resource: der erste Schritt währe, dir ein Resourcen-Script zu erstellen und die Datei als RCDATA da einzufügen. Wenn du das Script dann deiner EXE mitlinkst, ist die Datei schonmal als Resource vorhanden. Laden kannst du sie dann aus dem Programm heraus mit FindResource() und LoadResource(). Das Abspeichern müsste mit Streams gehen. Frag mich jetzt aber nicht weiter - kenn mich da nicht so aus.



  • Hallo Perner

    Hier mal ein bissel Code der dir weiterhefen könnte (sollte) !!

    Bsp.:

    Du hast in deinem Projekt eine EXE (TEST.EXE) vom Typ "PROGS" mit der ID ID_EXE1 importiert.

    Ich gehe folgenden weg. Zuerst muss man ja irgendwie auf die
    Resource zugreifen können. Dazu lade ich sie so ...

    HINSTANCE hApp = ::GetModuleHandle(0);
    ASSERT(hApp);
    
    HRSRC hResInfo; 
    hResInfo = ::FindResource(hApp,MAKEINTRESOURCE(ID_EXE1),TEXT("PROGS"));
    HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
    

    Jetzt ist die Recource geladen !! Nun brauchen wir einen Zeiger und die größe der Recource. Das mache ich so ...

    BYTE *PROG = (LPBYTE)::LockResource(hRes);
    int PROG_SIZE = SizeofResource(hApp,hResInfo);
    

    Mit diesen Informationen ist es nun ein leichtes mittels CFile, diesen Puffer auf die Platte zu zaubern ..

    CFile OutFile;
    OutFile.Open("C:\\TEST.EXE",OF_CREATE|OF_WRITE,NULL);
    OutFile.Write(PROG,PROG_SIZE);
    OutFile.Close();
    

    Ich hoffe das ist genau das was du brauchst, auf jedenfall ein Denkanstoss..

    AndOne 😃



  • BONG!

    C:\\TEST.EXE wurde nicht gefunden...



  • Super Auskunft. Echt! Wo wird sie nicht gefunden? Gibt es sie überhaupt?



  • klar gibts die, hast du selber angegeben und zwar hier:

    CFile OutFile;
    //Das isser
    OutFile.Open("C:\\TEST.EXE",OF_CREATE|OF_WRITE,NULL);
    OutFile.Write(PROG,PROG_SIZE);
    OutFile.Close();



  • Das war ich nicht, sondern <AndOne>. Da ich keine Ahnung von CFile habe, kann ich dazu auch nichts sagen. Sorry.



  • Also eigendlich sollte das funzen ...
    Hier mal ne EXE von mir die eine Resource nach C: kopiert.

    http://free.pages.at/and_one/ressource.exe

    Probiermal ... wenn das bei dir funzt und du das genau brauchst
    dann schick ich dir das Projekt per E-Mail und du kannst dir das mal anschauen .

    AndOne 😃



  • Sorry, is jetzt nicht persönlich gemeint, aber ich nehme keine *.exe dateien von fremden Leuten mehr, seitdem ein gemein getarnter Trojaner fast mein Ganzes System zerstört hätte, wenn mich nicht ein Netter Anti-Hacker mit einer Dialogbox gewarnt hätte...

    Vieleicht hab ich auch was falsch gemacht, ich schau mir den code gleich nochmal an.



  • Kann ich verstehen ...

    Ist aber 100% kein Virus/Trojaner ... aber net so schlimm.

    AndOne 😃


Anmelden zum Antworten