Resource aus Dialog in dll aufrufen
-
habe eine dll welche statisch gelinkt ist.
In dieser will ich eine Resource (BITMAP) des Dialogs (BITMAP) aufrufen.
Code der dll
resource ist der name
AFX_MANAGE_STATE(AfxGetStaticModuleState()); HINSTANCE hExe = AfxFindResourceHandle(resource,"RT_BITMAP"); // hExe = AfxGetInstanceHandle(); //ermittelt die EXE des Programms AfxSetResourceHandle(hExe); // Setzt den Zeiger wieder um HBITMAP hbmp = ::LoadBitmap(AfxGetResourceHandle(), resource); // Hier bekomme ich kein Handle hbmp ist 0 CBitmap bmp; bmp.FromHandle(hbmp); CDC memDc; memDc.CreateCompatibleDC(pDC); CBitmap * obmp = memDc.SelectObject(&bmp); // Hier dann Absturz BITMAP bm; bmp.GetBitmap(&bm); pDC->StretchBlt(rcBitmap.left, rcBitmap.top, rcBitmap.Width(), rcBitmap.Height(), &memDc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); memDc.SelectObject(obmp);
-
AFX_MANAGE_STATE ändert das Resourcehandle der Applikation in das der DLL um, damit Resourcen in der DLL von DLL-Funktionen ordentlich geladen werden können.
Lass das doch einfach mal weg, um an das Resource-Handle der Applikation zu kommen.
Is ne Idee, hab das selber noch nicht gemacht. Also nich schlagen, wenn's nich funzt
-
Am besten ist aber, Du übergibst der Funktion gleich ein HBITMAP, da sonst die Funktion nicht mehr geeignet ist, um Resourcen aus der DLL zu laden.
-
Resourcen werden sowieso nicht aus der DLL geladen.
Ich kann ihr auch kein HBITMAP übergeben da diese Funktion nur von der DLL selbst aufgerufen werden kann.Ich kann auch nicht einen Handle von der exe an die DLL übergeben da die DLL nur einen Filenamen bekommt.
Die DLL lädt aus einer INI verschiedene Parameter und Druckt je nach Parameter dann aus.z.B.
Image=100,100,400,400,resource,............Dies wird alles durch die dll gehandelt
Ich dachte, das man sich irgendwie den resourcehandle der exe holen kann.
Bezügl. AFX_MANAGE_STATEDa ich andere MFC-Klassen auch noch in der Funktion habe kann es hier zu problemen kommen. Oder nicht?
[ Dieser Beitrag wurde am 13.03.2003 um 11:49 Uhr von Unix-Tom editiert. ]
-
Oje, klingt kompliziert
Naja, es gibt 2 Möglichkeiten, die Resource aus einer EXE zu laden, von der DU nur den Namen hast. Entweder, Du startest den Prozess und holst Dir von dort alles, oder du kennst das binäre Resource-Format am Ende der EXE.
Da ich zweiteres für noch aufwendiger halte, denke ich, am günstigsten wäre, mit CreateProzess die EXE zu starten (man muss ja das Fenster nicht anzeigen). Dann kannst Du mit den API-Resourcefunktionen arbeiten.
AFX_MANAGE_STATE wird von der Funktion dann nicht benötigt.
-
Ne falsch verstanden.
Die EXE wo die Resource drin ist greift auf Funktionen der dll zu.In der Funktion dieser Exe wird eine Instanz der exportierten Klasse der dll erstellt und dann die Funktionen aufgerufen.
Ich kann aber nicht der Funktion zum Drucken des Bitmap einen Handle auf das Bitmap übergeben da beim erstellen des Instanz noch nicht bekannt ist welche Resource überhaupt ausgedruckt werden soll bwz. und ob überhaupt. Dies steht alles in der INI-Datei
-
Also war es doch richtig, wie ich es im 1. Post geschrieben habe.
Bzgl. AFX_MANAGE_STATE dürfte es keine Probleme geben, da Du wie Du schreibst, keine Resourcen der DLL nutzt.Dein Code:
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // das ist nicht hExe, sondern hResourceDLL HINSTANCE hExe = AfxFindResourceHandle(resource,"RT_BITMAP");
Umändern in:
// jetzt ist hExe richtig HINSTANCE hExe = AfxFindResourceHandle(resource,"RT_BITMAP");
-
geht nicht.
Ich habs aufgegeben und laden jetzt nicht aus Resource sondern aus Datei.danke
[ Dieser Beitrag wurde am 13.03.2003 um 16:16 Uhr von Unix-Tom editiert. ]