EXE in Resourcen



  • Hallo

    Gibts irgendeine Möglichkeit eine EXE-Datei in die Resourcen zu packen, so, dass man diese EXE-Datei dann während der Laufzeit rauskopieren kann ?

    Danke 🙂



  • Hi,

    ja, das geht.

    Ich habe vor einiger Zeit mal ne Funktion gebastelt

    *kramkram*

    CString GetBytesFromResource(int nResourceID, CString strResourceTyp)
    {
    	HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(nResourceID), strResourceTyp);
    	HGLOBAL hResourceLoaded = LoadResource(NULL, hResource);
    	char* lpResLocked = (char*) LockResource(hResourceLoaded);
    	if(strlen(lpResLocked) == 0)
    	{
    		AfxMessageBox("Fehler: Ressource ist leer.", "Fehler", MB_OK | MB_ICONSTOP);
    	}
    	return lpResLocked;
    }
    

    der 1. Parameter ist die Konstante, die die Ressource identifiziert
    der 2. Parameter ist der Ressourcetyp, den du beim Hinzufügen der Ressource zu deinem Projekt angegeben hast (z.B. BITMAP)

    Mit dieser Funktion kannst du auf die Bytes einer Ressource zugreifen (Typ spielt keine Rolle) und diese dann z.B. in einer Datei speichern:

    bool SaveBytesToFile(char* lpBytes, CString strFileName)
    {
    	CFile fFile;
    	if(!fFile.Open(strFileName, CFile::modeCreate | CFile::modeWrite))
    	{
    		// Fehlermeldung hier
    		return false;
    	}
    
    	// ich schreib jetzt einfach mal alle Bytes auf einmal in die Datei
    	fFile.Write(lpBytes, strlen(lpBytes));
    	fFile.Close();
    	return true;
    }
    

    Das müsste funktionieren

    Grüße Rapha
    ps. wäre das nicht etwas für die FAQ?



  • Super, vielen Dank 🙂



  • Hier der komplette ablauf

    HRSRC resource = FindResource( AfxGetInstanceHandle( ), MAKEINTRESOURCE( IDR_EXE1 ), "exe" );
    DWORD dwSize = SizeofResource( AfxGetInstanceHandle( ), resource );
    HGLOBAL hGlobal = LoadResource( AfxGetInstanceHandle( ), resource );
    LPVOID inhalt = LockResource( hGlobal );
    
    CFile OutputFile;
    OutputFile.Open("Name_der_Datei.exe", CFile::modeRead | CFile::modeWrite | CFile::modeCreate );
    OutputFile.Write( inhalt , dwSize );
    OutputFile.Close();
    
    FreeResource(hGlobal);
    


  • Rapha schrieb:

    ps. wäre das nicht etwas für die FAQ?

    So schnell geht es nicht. ZUerst muss der Source getestet und für vollständig angesehen werden. Es bringt nichts einen unvollständigen Source in die FAQ zu geben da hier wieder fragen kommen würde. Dies ist aber dann nicht der Sinn der FAQ.



  • Verstehe nicht, was ist bei meinem Code jetzt anders 😕 ?
    Der Code ist vollständig und funktioniert doch 😉

    Grüße Rapha



  • Danke funktioniert super. 🙂



  • Rapha schrieb:

    Verstehe nicht, was ist bei meinem Code jetzt anders 😕 ?
    Der Code ist vollständig und funktioniert doch 😉

    Grüße Rapha

    t.B. FreeResource(hGlobal);



  • Unix-Tom schrieb:

    Rapha schrieb:

    Verstehe nicht, was ist bei meinem Code jetzt anders 😕 ?
    Der Code ist vollständig und funktioniert doch 😉

    Grüße Rapha

    t.B. FreeResource(hGlobal);

    MSDN schrieb:

    It is not necessary to unlock resources because the system automatically deletes them when the process that created them terminates.



  • Man braucht auch keine Speicher freigeben da dieser auch automatisch freigegeben wir.

    Win98 macht dies ja auch alles. Deshalb ist das System ja so stabil aud frist keine Speicher.

    Es gibt Leute die ein Programm nicht nur zum Kurzen ausführen und wieder beenden schreiben. Es gibt Programme welche 24/7/365 laufen.

    Man sollte seinen Speicher wieder freigeben.
    Man sollte auch Resourcen wieder freigeben.

    👎



  • Hey, ganz ruhig 😉
    Stimmt natürlich was du sagst.

    Für wie dumm hälst du mich eigentlich? 😉
    Ich wollte dir nur zeigen dass der Code laut MSDN nicht falsch ist (stand so ähnlich bei Codeguru/Codeproject).
    Das ist auch nur ein Codehappen und kein komplettes Programm.
    Ich glaube kaum, dass jemand der wirklich ein "großes" Programm schreibt so dumm ist und einfach Code von dritten Personen kopiert ohne ihn zu optimieren.

    Grüße Rapha



  • Ich wollte damit auch nur aufzeigen welcher Code in die FAQ kommt. Natürlich gibt es oft nur unvollständigen Code hier. Aber dieser würde auch nicht sofort in die FAQ kommen. Ich bezog mein Posting auch nur auf die Anfrage bezügl. FAQ.



  • Dann ist ja alles in Ordung 👍


Anmelden zum Antworten