MFC DLL funktioniert nicht
-
Ich habe eine MFC DLL erstellt und möchte diese nun in ein anderes Projekt einbinden. Dies funktioniert auch noch, sobald ich jedoch die Applikation starte und einen Datentyp der Klasse welche sich in der MFC befindet erstellen möchte kommt immer folgender Fehler:
File: APPcore
Line 235
enhalte einen Fehler!Diese Fehlermeldung kommt sobal die Funktion:CDBConnectorApp::CDBConnectorApp()
aufgerufen wird!Kann mir jemand sagen, wo mein Fehler liegt?
-
Und welcher Code ist an dieser Stelle zu finden?
Der ASSERT hat ja eine Ursache in einer bestimmten Bedingung, die nicht erfüllt wird.
-
ASSERT(AfxGetThread() == NULL);
Sehr wahrscheinlich ist etwas in der DLL welche ich erstellt habe nicht in Ordnung, aber ich habe keine Ahnung was es sein könnte...
Ich finde es auch sehr merkwürdig, dass die Funktion: CDBConnectorApp::CDBConnectorApp() der DLL bereits einmal aufgerufen wird, wenn die Software gestartet jedoch noch kein Objekt von CDBConnectorApp angelegt wird!
-
Vermutlich hast Du eine globale Variable mit "CDBConnectorApp" irgendwo deklariert...
Schau doch einfach im Callstack nach, wer sie aufruft!
-
Oder er hat eine Extension DLL und hat die EXE Datei nicht mit der SharedDLL Version der MFC gelinkt!
-
Nein ich habe nur eine Deklaration von CDBConnectorApp!
Martin Richter schrieb:
Oder er hat eine Extension DLL und hat die EXE Datei nicht mit der SharedDLL Version der MFC gelinkt!
Wie und wo kann und muss ich dies nachschauen, beziehungsweise ändern?
-
Schau mal in die Projekteinstellungen ob Du dort die MFC statisch bindest oder die als Shared DLL!
-
Ich habe nun unter Verwendung von MFC "MFC in einer gemeinsam genutzten DLL verwenden" ausgewählt. (bei beiden Projekten - exe und DLL die selbe Einstellung) jedoch funktioniert es nicht so! Auch nicht mit "MFC in einer Statischen Bibliothek verwenden" kommt immernoch der selbe Fehler!
-
Callstack!?
-
Wo finde ich diesen?
-
Wenn der Assert auftritt auf "Wiederholen" drücken und dann (VS2005): "Debug|Windows|Call Stack"
-
In der Aufrufliste wird dies angezeigt:
> DBConnector.dll!CWinApp::CWinApp(const char * lpszAppName=0x00000000) Zeile 235 + 0x1c C++Wenn ich diese Zeilen auskommentiere:
CDBConnectorApp theApp;funktioniert es! Jedoch wenn ich die Applikation beenden möchte kommt ein Fehler!
-
CDBConnectorApp theApp;Ist doch eine globale Variable die beim Laden der DLL instanziiert wird... jetzt ist nur noch die Frage was da genau schief geht... mhh...
-
Sehr eigentümlich. Das ist also das CWinAp Objekt in Deiner DLL! Hast Du evtl. eine eigene DllMain definiert oder einen abweichenden Einsprungpunkt für die DLL?
-
Ich habe das Problem nun folgendermassen gelöst:
CDBConnectorApp DBConnector; CDBConnectorApp* CDBConnectorApp::Get() { return &DBConnector; }Wenn ich nun eine Funktion der DLL aufrufen möchte mache ich dies wie folgt:
CDBConnectorApp::Get()->FUNKTIONSNAMESo funktioniert das ganze nun ohne Probleme

-
Und wieso soll das helfen? Du hast ja noch immer ein globales Objekt?
-
Es wird aber nur noch 1x initialisiert...