MFC DLL funktioniert nicht
-
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...