app aus resource aufrufen



  • hey leutz!

    folgendes thema:

    ich will aus meinem programm ein anderes aufrufen.
    eigentlich kein problem, aber-> kann ich dieses programm
    irgendwie als resource inkludieren, damit ich nicht die binary
    des 2. programms immer mitgeben m uss, wenn ich das 1. proggie weitergebe???

    ich habs so versucht, dass ich die *.exe als resource inkludiert habe
    und dann zur laufzeit ausgelesen habe und in eine temporöre
    datei geschrieben habe, diese ausgeführt und bei beendigung des hauptprogrammes
    wieder löschen könnte. zum auslesen habe ich

    _read ( IDR_EXE1, &Buf, 1);
    

    benutzt. nur das klappt nich, was ja auch ganz logisch ist,
    da IDR_EXE1 kein handle einer datei ist.

    gibts da eine möglichkeit, sowas zu machen
    (*.exe als resource und zu laufzeit ausführen)???

    thx im vorraus,

    ich



  • Hallo,

    resourcen lassen sich zur Laufzeit aus der exe extrahieren und auf Platte
    speichern. Dein Ansatz funktioniert also.

    Beispielcode (ungetestet)

    HINSTANCE hInst = AfxGetInstanceHandle();
     HRSRC hRes = ::FindResource(hInst, "APP", "SETUPFILE");
     HGLOBAL hResource = ::LoadResource(hInst, hRes);
     DWORD dwLen = ::SizeofResource(hInst, hRes);
     BYTE* pFileData = (BYTE*)::LockResource(hResource);
    
     CFile f;
     f.Open(_T("MyResource.exe"), CFile::modeCreate|CFile::modeWrite));
     f.Write(pFileData, dwLen);
     f.Close();
    
     ::FreeResource(hResource);
    

    FindResource(hInst, "APP", "SETUPFILE") muss deinen Bedürfnissen angepasst werden!

    Gruss



  • ma guggn, ob ich das alles raff, abba thx für
    die schnelle antwort!

    ich probiers einfach mal aus, ich meld mich dann ma wieder



  • ok, verstanden hab ichs grösstenteils.

    void CExtractDlg::OnRun() 
    {
    	CFile f;
    	HINSTANCE hInst = AfxGetInstanceHandle();
    	HRSRC hRes = ::FindResource(hInst,"IDR_APPFILE",  
                               "APP"); //musste resourcen-name/typ tauschen
    	HGLOBAL hResource = ::LoadResource(hInst, hRes);
    	DWORD dwLen = ::SizeofResource(hInst, hRes);
    	BYTE* pFileData = (BYTE*) ::LockResource  (hResource);                                                                                                         
    
    	f.Open(_T("MyResource.exe"), CFile::modeCreate|CFile::modeWrite);
    	f.Write(pFileData, dwLen);
    	f.Close();
    
    	::FreeResource(hResource);
    }
    

    aso, fehlermeldungen bekomme ich nicht.
    die datei "MyResource.ico" wird auch erstellt, hat aber keinen
    inhalt ( grösse 0 byte).

    das problem ist

    HRSRC hRes = ::FindResource(hInst, "IDR_APPFILE", "APP");
    

    hRes erhält den wert NULL, deshalb kommt bei den funktionen,
    die hRes als parameter übergeben bekommen, auch nichts anständiges herraus.

    mit GetLastError () krieg ich den wert
    1814 (ERROR_RESOURCE_NAME_NOT_FOUND).

    versuche ich, eine standard resource (icon) auf diese weise zu laden, gibts
    1813 (ERROR_RESOURCE_TYPE_NOT_FOUND).

    DA LIEGT WOHL DAS PROBLEM!!!

    ausserdem steht in der dokumentation:

    LPVOID LockResource(
    HGLOBAL hResData // handle to resource to lock
    );

    Trying to lock a resource by using the handle returned by the FindResource or FindResourceEx
    function will not work. You will get back a value that is incorrect and points to random data.

    hat eventuell auch was zu sagen

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    FEHLER GEFUNDEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    es muss so sein:

    HRSRC hRes = ::FindResource(hInst, "#129", "APP");
    

    '#' und dann die dezimalzahl, als welche die resourcen ID definiert ist
    als string übergeben!!!!

    ES FUNZET!!!!!!!!!!!!!

    thx an alles und jeden!!! heut ist ein supertag!!!!!!



  • gibts vielleicht die möglichkeit,
    die app ohne extrahieren aus der exe direkt auszuführen???

    ich hab nichts gefunden, abba vielleicht...


Anmelden zum Antworten