Freigeben über


Modulzustände einer regulären, dynamisch mit MFC verknüpften MFC-DLL

Das dynamische Verknüpfen einer regulären MFC-DLL mit der MFC-DLL ermöglicht bestimmte Konfigurationen, die sehr kompliziert sind. Beispielsweise können eine reguläre MFC-DLL und die ausführbare Datei, die diese verwendet, dynamisch mit der MFC-DLL und mit allen MFC-Erweiterungs-DLLs verknüpft werden.

Diese Konfiguration stellt ein Problem bezüglich der globalen MFC-Daten dar, z. B. für den Zeiger auf das aktuelle CWinApp-Objekt und die Handle-Maps.

Vor MFC-Version 4.0 befanden sich diese globalen Daten in der MFC-DLL selbst und wurden von allen Modulen im Prozess gemeinsam verwendet. Da jeder Prozess, der eine Win32-DLL verwendet, eine eigene Kopie der DLL-Daten erhält, bietet dieses Schema eine einfache Möglichkeit, prozessbezogene Daten nachzuverfolgen. Da das AFXDLL-Modell davon ausgegangen ist, dass es nur ein CWinApp-Objekt und nur eine Reihe von Handlezuordnungen im Prozess gibt, können diese Elemente in der MFC-DLL selbst nachverfolgt werden.

Mit der Möglichkeit, eine normale MFC-DLL dynamisch mit der MFC-DLL zu verknüpfen, ist es jetzt jedoch möglich, dass ein Prozess zwei oder mehr CWinApp-Objekte und zwei oder mehr Sätze von Handlezuordnungen besitzt. Wie stellt das MFC fest, welche verwendet werden sollen?

Dazu muss jedes Modul (Anwendung oder reguläre MFC-DLL) eine eigene Kopie dieser globalen Zustandsinformationen erhalten. Folglich gibt ein Aufruf von AfxGetApp in der regulären MFC-DLL einen Zeiger auf das CWinApp-Objekt in der DLL zurück, nicht auf das in der ausführbaren Datei. Diese modulbezogene Kopie der globalen MFC-Daten wird als Modulzustand bezeichnet und in MFC Tech Note 58 beschrieben.

Die allgemeine MFC-Fensterprozedur wechselt automatisch in den richtigen Modulzustand, sodass Sie sich keine Sorgen über die in der regulären MFC-DLL implementierten Nachrichten-Handler machen müssen. Wenn Ihre ausführbare Datei jedoch die reguläre MFC-DLL aufruft, müssen Sie den aktuellen Modulzustand explizit auf den der DLL festlegen. Verwenden Sie dazu das Makro AFX_MANAGE_STATE in jeder Funktion, die aus der DLL exportiert wird. Dies erfolgt, indem die folgende Codezeile am Beginn der Funktionen hinzugefügt wird, die aus der DLL exportiert werden:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Worüber möchten Sie mehr erfahren?

Siehe auch

Erstellen von C/C++-DLLs in Visual Studio