Reine resource dll
-
IDB_BITMAP1 ist nichts anderes als eine Nummer. Unter dieser Nummer ist die
Resource abgelegt. Im Anwendungsprogramm muss diese Nummer natürlich bekannt sein.
Da du die Nummer deiner Bitmap natürlich in der deiner Resource-DLL nachkucken
kannst sollte das für dich kein Problem sein..
-
in der Resource.h der DLL hat IDB_BITMAP1 die ID 3001!?!
Deshalb habe ich in der Resource.h meiner Anwendung
diese Zeile eingefügt.#define IDB_BITMAP2 3001
Die Fehlermeldung ist weg, aber das Bitmap wird nicht angezeigt... ich bin sooo kurz davor, das spüre ich
Was ist jedoch jetzt noch falsch??!?!?
asmodia
-
LoadBitmap()
If the function succeeds, the return value is the handle to the specified bitmap.
If the function fails, the return value is NULL.Windows NT: To get extended error information, callGetLastError.
-
Ja danke, aber das hilft mir jetzt nicht wirklich.
Ich gehe schlafen, vielen Dank euch nocheinmal.
Morgen starte ich den nächsten Versuch ..
asmodia
-
Jaaaa Hurra!!!! es klappt.
hier für alle Verwirrten (wie mich) die Lösung:
Beim Erstellen der DLL unbedingt einen MFC Erweiterungs DLL erstellen.(hatte vorher eine Statisch Verknüpfte)
Dann in der APP Main (.exe) die resource.h der DLL includieren.Und dann um z.B ein Bitmap aus der DLL in der Anwendung anzuzeigen einfach folgenden Code in die Int packen
HINSTANCE hResDLL = LoadLibrary(_T("testDLL.dll")); HBITMAP hBitmap = LoadBitmap(hResDLL, MAKEINTRESOURCE(IDB_BITMAP1)); // Btmap Rahmen m_cPic.SetBitmap(hBitmap); FreeLibrary(hResDLL);
Ich weis Redhead, du hast die Lösung die ganze Zeit gewusst, aber jetzt weis ich sie auch, und bin Mega Happy.
Danke dir nochmal für deine geduld
Ich habe ja auch gerade mal 16 h für die Lösung gebraucht..
Bin wieder pennen
asmodia
-
Folgende Fehlermeldung habe ich noch nach dem Einbau in meine MDI Anwendung
MainFrm.cpp(616) : error C2664: 'CMdiClient::SetBitmap': Konvertierung des Parameters 1 von 'HBITMAP' in 'UINT' nicht möglich Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Hier ist mein Code
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (CMDIFrameWnd::OnCreateClient(lpcs, pContext)) { m_wndMdiClient.SubclassWindow(m_hWndMDIClient); HINSTANCE hResDLL = LoadLibrary(_T("my_bitmap.dll")); HBITMAP BACKROUNDBMP = LoadBitmap(hResDLL, MAKEINTRESOURCE(IDB_BACKROUND)); FreeLibrary(hResDLL); m_wndMdiClient.SetBitmap(BACKROUNDBMP); // Hintergrundbild MDI Child // alt m_wndMdiClient.SetBitmap(IDB_BACKROUND); // Hintergrundbild MDI Child return TRUE; } else return FALSE; }
An dieser Stelle setzte ich das Hintergrund Bild in meiner MDI Anwendung.
Mit dem alten Code
m_wndMdiClient.SetBitmap(IDB_BACKROUND); //
klappte es wunderbar als das Bitmap noch eine Resource der Anwendung und nicht der DLL war, nur jetzt wo ich das Bitmap aus der DLL Laden will kommt es zu dieser Fehlermledung. Wo ist das Problem, was muss ich tun??
DANKE
asmodia
-
Sach mal, so wie ich deinen Code gerade sehr lädst und schließt du ständig diese eine arme DLL. Warum denn nicht nur einmal laden?
HINSTANCE Klasse::getDll() { static HINSTANCE DLL; if(!DLL) DLL = LoadLibrary(T_("testDLL.dll")); return DLL; } Klasse::~Klasse() { HINSTANCE DLL = getDll(); if(DLL) FreeLibrary(DLL); }
-
Ja, hast schon recht. Aber in dieser Klasse lade ich nur ein Bitmap aus der DLL und öffne Sie also nur einmal. Später wenn ich in einer Klasse mehr Bitmaps aus der DLL benötige, mach ich das anders. Nur wie wandel ich jetzt das HBITMAP in ein UINT um? Denn ein UNIT wird von der Funktion SetBitmap erwartet. Hier ist der Code der Funktion SetBitmap für meinen MDI Client Bereich
//MdiClient.h BOOL SetBitmap(UINT nID);
//MdiClient.cpp BOOL CMdiClient::SetBitmap(UINT nID) { BOOL bResult = true; LockWindowUpdate(); if (m_pBmp) { m_pBmp->DeleteObject(); delete m_pBmp; m_pBmp = NULL; } m_pBmp = new CBitmap(); bResult = m_pBmp->LoadBitmap(nID); UnlockWindowUpdate(); return bResult; }
Ich weis das ich es ändern muss, das kein UNIT erwartet wird. Aber wie mach ich das? oder kann man auch vorher ein HBITMAP in ein UNIT umwandeln??
asmodia
-
Wenn ich jetzt das BMP aus der DLL beim Start der Anwendung Temporär auslagern würde, und es dann m_wndMdiClient.SetBitmap(">>hier<<"); wieder laden würde, müsst das doch funktionieren?!?! aber das wäre nicht soo schön, oder??
asmodia
-
vielleicht geht es auch, wenn ich eine Kopie des BMP aus der DLL erstelle, und in die Resourcen der Anwendung einfüge. Hat jemand dafür vielleicht eine Idee??
asmodia