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


Anmelden zum Antworten