Freigeben über


Einstiegspunkte für exportierte DLL-Funktionen

Verwenden Sie für exportierte Funktionen einer DLL das AFX_MANAGE_STATE Makro, um den richtigen globalen Zustand zu Standard, wenn Sie vom DLL-Modul zur DLL-Datei der aufrufenden Anwendung wechseln.

Wenn dieses Makro aufgerufen wird, wird ein Zeiger auf eine AFX_MODULE_STATE Struktur festgelegtpModuleState, die globale Daten für das Modul enthält, als effektiver Modulzustand für den re Standard der des enthaltenden Bereichs der Funktion. Beim Verlassen des Bereichs, der das Makro enthält, wird der vorherige effektive Modulstatus automatisch wiederhergestellt.

Dieser Wechsel wird erreicht, indem eine Instanz einer AFX_MODULE_STATE Klasse im Stapel erstellt wird. In seinem Konstruktor ruft diese Klasse einen Zeiger auf den aktuellen Modulstatus ab und speichert ihn in einer Membervariable und legt ihn dann als neuen effektiven Modulstatus fest pModuleState . In seinem Destruktor stellt diese Klasse den in seiner Membervariablen gespeicherten Zeiger als effektiven Modulzustand wieder her.

Wenn Sie über eine exportierte Funktion verfügen, z. B. eine Funktion, die ein Dialogfeld in Ihrer DLL startet, müssen Sie den folgenden Code am Anfang der Funktion hinzufügen:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

Dadurch wird der aktuelle Modulstatus durch den Zustand ausgetauscht, der von AfxGetStaticModuleState zurückgegeben wird, bis zum Ende des aktuellen Bereichs.

Probleme mit Ressourcen in DLLs treten auf, wenn das AFX_MANAGE_STATE Makro nicht verwendet wird. Standardmäßig verwendet MFC das Ressourcenhandle der Standard Anwendung, um die Ressourcenvorlage zu laden. Diese Vorlage wird tatsächlich in der DLL gespeichert. Die Ursache ist, dass die Modulstatusinformationen von MFC nicht vom AFX_MANAGE_STATE Makro gewechselt wurden. Der Ressourcenhandle wird aus dem Modulstatus von MFC wiederhergestellt. Wenn Sie den Modulstatus nicht wechseln, wird das falsche Ressourcenhandle verwendet.

AFX_MANAGE_STATE muss nicht in jede Funktion in der DLL eingefügt werden. Kann z. B. vom MFC-Code in der Anwendung aufgerufen werden, InitInstance ohne AFX_MANAGE_STATE dass MFC den Modulzustand InitInstance vor und dann zurückwechselt InitInstance . Dasselbe gilt für alle Nachrichtenzuordnungshandler. Normale MFC-DLLs verfügen tatsächlich über eine spezielle Masterfensterprozedur, mit der der Modulstatus automatisch vor dem Weiterleiten einer Nachricht gewechselt wird.

Siehe auch

Verwalten der Statusdaten von MFC-Modulen