dll aus der resource laden



  • hi leute,

    ich habe 'ne dll als resource in mein prog eingefügt.
    jetzt wollte ich gerne auf diese dll wären der laufzeit zugreifen um sie in ein verzeichnis zu kopieren.

    frage:
    muss ich einfach eine neue datei anlegen bsp: "mydll.dll" und dann aus der resource byte für byte in die "mydll.dll" kopieren, oder gibt es andere möglichkeit.

    ich hoffe ich habe mich klar ausgedruckt... vor dem wochenende ist das nämlich gar nicht so einfach... hehe

    thx
    toom





  • hi all,

    also ich glaube ich muss mein hobby wehseln... ich bekomme die einfachsten funktionen nicht in den griff.

    das mit dem laden der dll aus der resource hat nicht hingehauen... ergend etwas mache ich falsch. Weil ich den fehler nicht finden koennte habe ich mir neues projekt angelegt, icon als resource hinzugefügt und versucht wenigsten den icon aus der resource zu laden, was ach nicht hinhaut. hier der code:

    #include <windows.h>
    #include "resource.h"
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    	HGLOBAL hResource ;
    	hResource = LoadResource (hInstance, FindResource (hInstance, TEXT ("IDI_ICON1"), TEXT ("Icon"))) ;
    	if (hResource == NULL)
    		MessageBox (NULL, "ist immer noch NULL", "leider", NULL) ;
    	FreeResource (hResource) ;
    	return 0 ;
    }
    

    so macht das der Pezold (s. 416).
    ich bekomme immer die message ausgegeben.
    hier noch die script1.rc :

    //Microsoft Developer Studio generated resource script.
    //
    #include "resource.h"
    
    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "afxres.h"
    
    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS
    
    /////////////////////////////////////////////////////////////////////////////
    // Deutsch (Deutschland) resources
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
    #ifdef _WIN32
    LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
    #pragma code_page(1252)
    #endif //_WIN32
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // Icon
    //
    
    // Icon with lowest ID value placed first to ensure application icon
    // remains consistent on all systems.
    IDI_ICON1               ICON    DISCARDABLE     "icon1.ico"
    
    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //
    
    1 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "resource.h\0"
    END
    
    2 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "#include ""afxres.h""\r\n"
        "\0"
    END
    
    3 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "\r\n"
        "\0"
    END
    
    #endif    // APSTUDIO_INVOKED
    
    #endif    // Deutsch (Deutschland) resources
    /////////////////////////////////////////////////////////////////////////////
    
    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED
    

    und die resource.h :

    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by Skript1.rc
    //
    #define IDI_ICON1                       101
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1000
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

    wie gesagt ich habe keine ahnung wo der fehler liegt.
    vileicht koennt ihr mir helfen.

    thx

    toom



  • Was liefern denn die einzelnen Funktionsaufrufe zurück? Und was sagt dann ggf. GetLastError()



  • TEXT ("IDI_ICON1"),
    

    Das sollte wohl MAKEINTRESOURCE(IDI_ICON1) heissen, gelle?



  • So, ich habe das jetzt selber mal probiert. Mit Icons ist das tatsächlich etwas tricky. Aber so funktioniert es:

    HICON MyLoadIcon(HINSTANCE hInst, LPCTSTR lpName)
    {
      HGLOBAL   hGlobal;
      HRSRC     hrsrc;
      PVOID     pData;
      HICON     hIcon = NULL;
      int       nID = 0;
    
        if(NULL == (hrsrc = FindResource(hInst, lpName, RT_GROUP_ICON)))
            return(NULL);
    
        if(NULL == (hGlobal = LoadResource(hInst, hrsrc)))
            return(NULL);
    
        if(NULL != (pData = LockResource(hGlobal)))
        {
            nID = LookupIconIdFromDirectory((BYTE*)pData, TRUE);
            UnlockResource(hGlobal);
        }
        FreeResource(hGlobal);
    
        if(!nID)
            return(NULL);
    
        if(NULL == (hrsrc = FindResource(hInst, MAKEINTRESOURCE(nID), RT_ICON)))
            return(NULL);
    
        if(NULL == (hGlobal = LoadResource(hInst, hrsrc)))
            return(NULL);
    
        if(NULL != (pData = LockResource(hGlobal)))
        {
            hIcon = CreateIconFromResource((BYTE*)pData, SizeofResource(hInst, hrsrc), TRUE, 0x00030000);
            UnlockResource(hGlobal);
        }
        FreeResource(hGlobal);
    
      return(hIcon);
    }
    

    Nicht schön, aber ganz bestimmt sehr, sehr selten. 😉



  • Danke, hast mir sehr geholfen.

    Ich habe jetzt nur noch ein problem:

    mit folgendem code komme ich an die dll in der resource (funzt alles soweit):

    #include <windows.h>
    #include "resource.h"
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    	HGLOBAL hResource ;
    	PVOID	pData;
    	hResource = LoadResource (hInstance, FindResource (hInstance, MAKEINTRESOURCE (105), TEXT ("DLL"))) ;
    	if (hResource == NULL)
    		MessageBox (NULL, "ist immer noch NULL", "leider", NULL) ;
    	if (NULL != (pData = LockResource (hResource))){
    		//was muss hier passieren
    	} 
    	FreeResource (hResource) ;
    	return 0 ;
    }
    

    meine frage:

    wie bekomme ich die dll aus der resource in ein verzeihnis kopiert?

    ist meine vermutung richtig, dass ich die grosse der dll in der resource herausfinden muss und dann byte für byte in eine von mir erstellte datei bsp. mydll.dll reinkopieren muss. Oder gibt es eine viel einfachere lösung.

    thx

    toom



  • toom schrieb:

    wie bekomme ich die dll aus der resource in ein verzeihnis kopiert?

    ist meine vermutung richtig, dass ich die grosse der dll in der resource herausfinden muss und dann byte für byte in eine von mir erstellte datei bsp. mydll.dll reinkopieren muss. Oder gibt es eine viel einfachere lösung.

    Ich würde die Daten in einem Rutsch in die Datei schreiben:

    if (NULL != (pData = LockResource (hResource))){ 
            //was muss hier passieren 
            WriteFile(hFile, pData, SizeofResource(hInstance, hrsrc), &dwWritten, NULL);
        }
    

    Du bekommst hrsrc von FindResource geliefert.



  • ich danke dir für deine mühe... funzt alles wunderbar.

    mfg
    toom


Anmelden zum Antworten