Richtig eine statisch gelinkte MFC DLL erstellen ?
-
Hallo zusammen,
ich habe hier gerade mächtig Probleme mit dem Erzeugen einer DLL mit einem
MFC Fenster. Als erstes bekomme ich das übliche _DLLMain Problem im Linker
und wenn ich denn mit /FORCE mal weitermache, klappt es nicht auf jeden Rechner.Also was ich haben möchte:
Eine DLL, die einen Dialog enthält den ich irgendwann mit .doModal aufrufe.
Diese soll die MFC statisch gelinkt haben, keine öffentliche MFC benutzen.Wie fängt man an ? MFC Erweiterungs DLL erzeugen oder eine Normale und dann mit
AFX_MANAGE_STATE(AfxGetStaticModuleState( )); weiterarbeiten ?Mich interressiert auch, wie ich die DllMain sauber bekomme, das nicht die MFC
DLLMain ignoriert wird durch ein Force. (nur durch InitInstance() und ExitInstance() ?)Grüße
thenoname
-
Die DllMain wird (wenn Du keine Extension DLL) erzeugst durch die MFC gestellt.
Also: Keine DllMain für Dich!
Alles wird durch das CWinApp Objekt der MFC abgedeckt. Letten Endes instanziiert die MFC dann das CWinApp Objekt und ruft InitInstance auf.
Mit der MFC benötigst Du keine DLL-Main!Eine Erweiterungs DLL ist nicht das was Du willst, also Standard DLL, außer Du möchtest einen vollen Klassenexport und Einbindung in ein anderes MFC Programm. Extension DLLs kann man auch nicht statisch binden.
Du musst immer AFX_MANAGE_STATE verwenden!
-
Hallo, danke für die klaren Aussagen.
Ich muss also statt eine DLLMAIN zu erzeugen die beiden Funktionen InitInstance() und ExitInstance() verwenden.Du musst immer AFX_MANAGE_STATE verwenden!
Beim Erzeugen einer statischen DLL kommt merkwürdigerweise folgender verwirrender Text:
//
//TODO: Wenn diese DLL dynamisch mit MFC-DLLs verknüpft ist,
// muss für alle aus dieser DLL exportierten Funktionen, die in
// MFC aufgerufen werden, das AFX_MANAGE_STATE-Makro
// am Anfang der Funktion hinzugefügt werden.
//
// Beispiel:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // Hier normaler Funktionsrumpf
// }
//
// Es ist sehr wichtig, dass dieses Makro in jeder Funktion
// vor allen MFC-Aufrufen angezeigt wird. Dies bedeutet,
// dass es als erste Anweisung innerhalb der
// Funktion angezeigt werden muss, sogar vor jeglichen Deklarationen von Objektvariablen,
// da ihre Konstruktoren Aufrufe in die MFC-DLL generieren
// könnten.
//
// Siehe Technische Hinweise für MFC 33 und 58 für weitere
// Details.
//Also wenn ich es richtig lese, brauche ich AFX_MANAGE_STATE in einer statischen DLL nicht ? Warum dann überhaupt die Meldung ?
Grüße
thenoname
-
OK ich korrigiere mich: Du sollst immer AFX_MANAGE_STATE verwenden.
Es ist richtig, dass bei einer statischen DLL die Ressource-Handles immer richtig gesetzt werden. Das Makro wird zum Qusai-Noop (es passiert immer noch was).
Ich halte jedoch in diesem Fall jedoch nichts von Weglassen, nachher stellst Du Deine DLL auf shared MFC DLL um und schon geht nichts mehr...