Probleme mit MFC- Dialogen in einer Standard- DLL (keine Erweiterungs- DLL)



  • Hallo zusammen,

    ich habe zu Testzwecken eine kleine DLL geschrieben
    "Reguläre DLL, die eine gemeinsam genutze MFC- DLL verwendet".
    Hintergrund ist, Bibliotheken mit MFC- Dialogen (Resourcen) in Nicht- MFC- Appliaktionen weiterzuverwenden, aber das wird Schritt 3.
    Die von mir geschriebene DLL exportiert eine Funktion, die ihrerseits einen Dialog aus der DLL modal zu Anzeige bringt.

    extern "C" __declspec (dllexport) int TestDLLDialogTest()
    {
    	int nFuncRes = 1;
    	CTestDllDlg* pDlgTest = new CTestDllDlg;
    
    	TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
    	TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetResourceHandle());
    
    	AFX_MODULE_STATE* pModuleState=NULL;
    	pModuleState = AfxGetStaticModuleState();
    	AFX_MANAGE_STATE(pModuleState);
    
    	TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
    	TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetResourceHandle());
    	TRACE("Eintritt in meine Dialogtestfunktion");
    
    	pDlgTest->m_strDLLTest = "Peters Testtext";
    	pDlgTest->DoModal();
    	if (pDlgTest != NULL)
    	{
    		delete pDlgTest;
    		pDlgTest = NULL;
    	}
    
    	return nFuncRes;
    }
    

    Mit den TRACES habe ich nur den Effekt des Umschaltens der Resourcen von meiner MFC- Test- Applikationen auf die DLL- Resourcen beobachtet. Das lässt sich auch zunächst gut nachvollziehen.

    Mein kleines Testprogramm, welches die DLL einbindet, ist eine Dialogbasierte MFC- Applikation mit einem Schalter, in dessen OnBtn- Klick- Funktion, die importierte DLL- Funktion "TestDLLDialogTest()" aufgerufen wird.

    (im Header der CStandardDLLTestAppDlg- Klasse enthalten)
    extern "C" __declspec (dllimport) int TestDLLDialogTest();

    void CStandardDLLTestAppDlg::OnBnClickedButton1()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	TestDLLDialogTest();
    
    }
    

    Alles funktioniert zunächst, wie erwartet!
    Ich klicke den Button, mein Dialog aus der DLL wird modal angezeigt, alles passt, aber wenn ich diesen Dialog aus der DLL beende, "fliegt er mir um die Ohren".
    In der MFC- Funktion

    mfc90ud.dll!CWnd::DestroyWindow() Zeile 1027 + 0x1e Bytes C++
    wird das ASSERT ausgelöst.

    #ifdef _DEBUG
    	ASSERT(m_hWnd == hWndOrig);
    #endif
    

    Ich bin ratlos. Es ist erst Schritt 2. Einfachste DLL in MFC- Applikation.
    (Mit WinXP und Visual Studio 2005, mfc80ud.dll gleiches Verhalten)
    Bei Schritt3, Einsatz der selben DLL in . NET- Applikation kommt der Fehler schon beim ::Create des Dialogs.
    Ich vermute die Problemen bei der Resourcenhandhabung, habe hier aber echte Wissens- und Verständnislücken.
    Bitte um Hilfe, ist echt wichtig...
    Danke im Voraus!



  • Zunächstmal muss/sollte

    AFX_MANAGE_STATE(pModuleState);
    

    als erstes aufgerufen werden in exportierten Funktionen.

    If this DLL is dynamically linked against the MFC DLLs,
    any functions exported from this DLL which call into
    MFC must have the AFX_MANAGE_STATE macro added at the
    very beginning of the function.

    Wo passiert der Absturz? Noch in deiner exportierten Funktion?
    Macht dein Testdialog irgendwas besonderes beim Beenden?



  • Hallo

    danke für Deine Antwort. Es war tatsächlich die Lösung. Ich habe jetzt AFX_MANAGE_STATE(pModuleState);
    an den Anfang, d.h. vor CTestDllDlg* pDlgTest = new CTestDllDlg;
    gesetzt. Jetzt läuft es mit der MFC- Applikation!!??
    Danke für diesen wichtigen Hinweis!

    Damit hat sich auch das Thema mit dem Aufruf aus der .NET- Applikation gelöst.

    DANKE!!


Anmelden zum Antworten