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
-
FindResource
LoadResource
LockResource
SizeofResourceund natürlich FreeResource nicht vergessen.
-
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