Absturz bei DestroyWindow() nach AfxSetResourceHandle()



  • danke,

    das makro habe ich ja sogar verwendet. aber der fehler tritt ja auch nicht in der DLL auf, sondern in der applikation.

    die funktion in der applikation, welche ein dialogfeld erzeugen soll, wird von der DLL aufgerufen.

    hoffe ihr versteht mich richtig.

    ich habe jetzt in meiner DLL '_USRDLL' definiert, in meinem programm habe ich '_WINDLL' definiert (jeweils unter präprozessordefinitionen).
    das hat jedoch nichts genützt.

    '_AFXDLL' hatte ich bereits definiert in DLL und programm, da ich beide sonst nicht kompilieren konnte.

    bin da echt ratlos !?



  • ich versuche es jetzt mit 'LoadResource()'. Mein bisheriger code sieht so aus:

    HRSRC hSrcFile = FindResource(hInst, MAKEINTRESOURCE(IDD_OBJECT_EDITOR), RT_DIALOG); 
    
    if (hSrcFile != NULL)
    { 
    	LoadResource(hInst, hSrcFile); 
    
    	CObjectEditor oObjEdit;
    
    	oObjEdit.DoModal();
    
    	DWORD dErr = GetLastError();
    }
    

    hInst ist ein gültiges Modulhandle auf meine Applikation. der code ist ein ausschnitt von meiner funktion, welche innerhalb der applikation von der DLL aufgerufen wird.

    GetLastError() liefert mir wie gehabt 'ERROR_RESOURCE_DATA_NOT_FOUND'.

    ich habe auch eine bitmapresource in meinem dialog. ich habe auch die bereits versucht zu laden, ohne erfolg.

    wende ich LoadResource() falsch an ?? oder ist der weg ganz verkehrt ?

    (ich gehe ähnlich wie in diesem beispiel vor. bei den kommentaren hat jemand das selbe problem, er öffnet das dialogfeld aber aus der DLL heraus)


  • Mod

    Ich habe noch nicht verstanden, wo den die Dialog Ressource liegt. In der EXE oder in der DLL.
    Du musst dann das entsprechende hInst Handle auch bereitstellen, dann geht das auch.



  • das handle wird korrekt bereitgestellt, es ist das handle auf meine applikation.
    ich habe das problem seit dem ich die laufzeitbibliothek auf Multithreaded-DLL (/MD) gestellt habe. vorher hatte ich Multithreaded (/MT) verwendet.

    ich habe den ganzen aufbau gezeichnet: AUFBAU.


  • Mod

    1. Alle Module müssen die gleiche MFC und die gleiche CRT verwenden. Am besten Multithreaded DLL
    2. Auch im Callback in der Exe musst Du AFX_MANAGE_STATE verwenden, damit hier die Ressource auch wieder gefunden wird.

    Grundsätzlich gilt das für alle Callbacks die Modulübergreifend angesprochen werden.



  • ich verwende MFC in einer statischen bibliothek, sowohl in DLL als auch in der applikation.

    AFX_MANAGE_STATE habe ich jetzt in allen callbacks nachgerüstet. es tritt jetzt allerdings ein anderer fehler auf:

    in CDialog::DoModal()

    INT_PTR CDialog::DoModal()
    {
    	// can be constructed with a resource template or InitModalIndirect
    	ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
    		m_lpDialogTemplate != NULL);
    
    	// load resource as necessary
    	LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
    	HGLOBAL hDialogTemplate = m_hDialogTemplate;
    
    	// Der Fehler triit in der NÄCHSTEN ZEILE auf !!:
    	HINSTANCE hInst = AfxGetResourceHandle();
    
    	// ...
    }
    

    sorry, brauchst du vielleicht noch andere informationen ?? ich bin echt überfragt bei diesem problem 🙄

    danke


  • Mod

    Und wo kracht es jetzt?

    Dir ist klar, dass Du bei Verwendung der statischen CRT keine Zeiger mehr in anderen Modulen freigeben darfst und dass Du keine CString Objekte und stl Objekte über Modulgrenzen austatauschen darfst.



  • nein, was wusste ich bisher nicht.

    Bei verwendung von MFC in Shared DLL und Win-StandardBibliothek tritt der selbe fehler auf.

    in der zeile HINSTANCE hInst = AfxGetResourceHandle(); hat er das problem.



  • mir ist gerade etwas aufgefallen:

    befor ich 'AFX_MANAGE_STATE(AfxGetStaticModuleState())' aufrufe, kann ich 'AfxGetResourceHandle()' problemlos verwendet. nach dem aufruf bekomme ich den fehler bei 'AfxGetResourceHandle()'.



  • es klappt jetzt:

    ich benutze 'Multithreaded (/MT)' mit statischer bibliothek.

    ich habe das mit sicherheit schon bei mtesten eingestellt gehabt. vermutlich habe ich einige projekteinstellungen verändert und durch die kombination der geänderten einstellungen lief es nicht.

    danke dir !!!


Anmelden zum Antworten