Makros und Funktionen zum Verwalten von DLLs
Name | Beschreibung |
---|---|
AFX_EXT_CLASS ] |
Exportiert Klassen. |
AFX_MANAGE_STATE |
Schützen Sie eine exportierte Funktion in einer DLL. |
AfxOleInitModule |
Bietet OLE-Unterstützung von einer regulären MFC-DLL, die dynamisch mit MFC verknüpft ist. |
AfxNetInitModule |
Stellt MFC Sockets Unterstützung von einer regulären MFC-DLL bereit, die dynamisch mit MFC verknüpft ist. |
AfxGetAmbientActCtx |
Ruft den aktuellen Status des Flags pro Modul ab. |
AfxGetStaticModuleState |
Legt den Modulstatus vor der Initialisierung fest und stellt den vorherigen Modulstatus nach der Bereinigung wieder her. |
AfxInitExtensionModule |
Initialisiert die DLL. |
AfxSetAmbientActCtx |
legen Sie das Statuskennzeichnung pro Modul fest, das sich auf das WinSxS-Verhalten von MFC auswirkt. |
AfxTermExtensionModule |
Ermöglicht MFC, die MFC-Erweiterungs-DLL zu bereinigen, wenn jeder Prozess von der DLL getrennt wird. |
AFX_EXT_CLASS
MFC-Erweiterungs-DLLs verwenden das Makro AFX_EXT_CLASS
zum Exportieren von Klassen. Die ausführbaren Dateien, die mit der MFC-Erweiterungs-DLL verknüpft sind, verwenden das Makro zum Importieren von Klassen.
Hinweise
Mit dem AFX_EXT_CLASS
Makro können die gleichen Headerdateien, die zum Erstellen der MFC-Erweiterungs-DLL verwendet werden, mit den ausführbaren Dateien verwendet werden, die mit der DLL verknüpft sind.
Fügen Sie in der Headerdatei für Ihre DLL das AFX_EXT_CLASS
Schlüsselwort zur Deklaration Ihrer Klasse wie folgt hinzu:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Weitere Informationen finden Sie unter Exportieren und Importieren mithilfe von AFX_EXT_CLASS
.
Anforderungen
Header:<afxv_dll.h>
AFX_MANAGE_STATE
Rufen Sie dieses Makro auf, um eine exportierte Funktion in einer DLL zu schützen.
Syntax
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Parameter
pModuleState
Ein Zeiger auf eine AFX_MODULE_STATE
Struktur.
Hinweise
Wenn dieses Makro aufgerufen wird, pModuleState
ist der effektive Modulstatus für den Rest des unmittelbaren enthaltenden Bereichs. Beim Verlassen des Bereichs wird der vorherige effektive Modulstatus automatisch wiederhergestellt.
Die AFX_MODULE_STATE
Struktur enthält globale Daten für das Modul, d. h. den Teil des Modulzustands, der pushed oder popped wird.
Standardmäßig verwendet MFC das Ressourcenhandle der Hauptanwendung, um die Ressourcenvorlage zu laden. Wenn Sie eine exportierte Funktion in einer DLL haben, z. B. eine Funktion, die ein Dialogfeld in der DLL startet, wird die Ressourcenvorlage im DLL-Modul gespeichert. Stellen Sie sicher, dass Sie den Modulstatus wechseln, damit der richtige Handle verwendet werden kann. Sie können den Zustand wechseln, indem Sie den folgenden Code am Anfang der Funktion hinzufügen:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Dieses Makro wechselt den aktuellen Modulstatus mit dem Zustand, der von AfxGetStaticModuleState
bis zum Ende des aktuellen Bereichs zurückgegeben wird.
Weitere Informationen zu Modulzuständen und MFC finden Sie unter Managing the state data of MFC modules and Technical Note 58.
Hinweis
Wenn MFC einen Aktivierungskontext für eine Assembly erstellt, wird AfxWinInit
der Kontext erstellt und AFX_MANAGE_STATE
aktiviert und deaktiviert. Beachten Sie auch, dass AFX_MANAGE_STATE
für statische MFC-Bibliotheken sowie MFC-DLLs aktiviert ist, damit MFC-Code im richtigen Aktivierungskontext ausgeführt werden kann, der von der Benutzer-DLL ausgewählt wird. Weitere Informationen finden Sie unter Unterstützung für Aktivierungskontexte im MFC-Modulstatus.
Anforderungen
Header:<afxstat_.h>
AfxOleInitModule
Rufen Sie diese Funktion für die OLE-Unterstützung einer regulären MFC-DLL, die dynamisch mit MFC verknüpft ist, in der funktion der regulären MFC-DLL CWinApp::InitInstance
auf, um die MFC OLE DLL zu initialisieren.
Syntax
void AFXAPI AfxOleInitModule( );
Hinweise
Die MFC OLE DLL ist eine MFC-Erweiterungs-DLL; Damit eine MFC-Erweiterungs-DLL in eine CDynLinkLibrary
Kette verkabelt werden kann, muss sie ein CDynLinkLibrary
Objekt im Kontext jedes Moduls erstellen, das es verwendet. AfxOleInitModule
erstellt das CDynLinkLibrary
Objekt im Kontext Ihrer regulären MFC-DLL, sodass es in die CDynLinkLibrary
Objektkette der regulären MFC-DLL verkabelt wird.
Wenn Sie ein OLE-Steuerelement erstellen und verwenden COleControlModule
, sollten Sie nicht aufrufen AfxOleInitModule
, da die InitInstance
Memberfunktion für COleControlModule
Aufrufe verwendet AfxOleInitModule
wird.
Anforderungen
Kopfzeile: <afxdll_.h>
AfxNetInitModule
Fügen Sie für MFC-Sockets unterstützung von einer regulären MFC-DLL, die dynamisch mit MFC verknüpft ist, einen Aufruf dieser Funktion in der Funktion der regulären MFC-DLL CWinApp::InitInstance
hinzu, um die MFC Sockets DLL zu initialisieren.
Syntax
void AFXAPI AfxNetInitModule( );
Hinweise
Die MFC Sockets DLL ist eine MFC-Erweiterungs-DLL; Damit eine MFC-Erweiterungs-DLL in eine CDynLinkLibrary
Kette verkabelt werden kann, muss sie ein CDynLinkLibrary
Objekt im Kontext jedes Moduls erstellen, das es verwendet. AfxNetInitModule
erstellt das CDynLinkLibrary
Objekt im Kontext Ihrer regulären MFC-DLL, sodass es in die CDynLinkLibrary
Objektkette der regulären MFC-DLL verkabelt wird.
Anforderungen
Header:<afxdll_.h>
AfxGetAmbientActCtx
Verwenden Sie diese Funktion, um den aktuellen Status des Flags pro Modul abzurufen, das sich auf das WinSxS-Verhalten von MFC auswirkt.
Syntax
BOOL AFXAPI AfxGetAmbientActCtx();
Rückgabewert
Aktueller Wert des Modulstatus.
Hinweise
Wenn das Flag festgelegt ist (die Standardeinstellung) und ein Thread ein MFC-Modul eingibt (siehe AFX_MANAGE_STATE
), wird der Kontext des Moduls aktiviert.
Wenn das Flag nicht festgelegt ist, wird der Kontext des Moduls beim Eintrag nicht aktiviert.
Der Kontext eines Moduls wird anhand seines Manifests bestimmt, häufig in Modulressourcen eingebettet.
Anforderungen
Header:<afxcomctl32.h>
AfxGetStaticModuleState
Rufen Sie diese Funktion auf, um den Modulstatus vor der Initialisierung festzulegen und den vorherigen Modulstatus nach der Bereinigung wiederherzustellen.
Syntax
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Rückgabewert
Ein Zeiger auf eine AFX_MODULE_STATE
Struktur.
Hinweise
Die AFX_MODULE_STATE
Struktur enthält globale Daten für das Modul, d. h. den Teil des Modulzustands, der pushed oder popped wird.
Standardmäßig verwendet MFC das Ressourcenhandle der Hauptanwendung, um die Ressourcenvorlage zu laden. Wenn Sie eine exportierte Funktion in einer DLL haben, z. B. eine Funktion, die ein Dialogfeld in der DLL startet, wird die Ressourcenvorlage im DLL-Modul gespeichert. Stellen Sie sicher, dass Sie den Modulstatus wechseln, damit der richtige Handle verwendet werden kann. Sie können den Zustand wechseln, indem Sie den folgenden Code am Anfang der Funktion hinzufügen:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Dieses Makro wechselt den aktuellen Modulstatus mit dem Zustand, der von AfxGetStaticModuleState
bis zum Ende des aktuellen Bereichs zurückgegeben wird.
Weitere Informationen zu Modulzuständen und MFC finden Sie unter Managing the state data of MFC modules and Technical Note 58.
Anforderungen
Header:<afxstat_.h>
AfxInitExtensionModule
Rufen Sie diese Funktion in einer MFC-Erweiterungs-DLL DllMain
auf, um die DLL zu initialisieren.
Syntax
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Parameter
state
Ein Verweis auf die AFX_EXTENSION_MODULE
Strukturstruktur , die den Status des MFC-Erweiterungs-DLL-Moduls nach der Initialisierung enthält. Der Zustand enthält eine Kopie der Laufzeitklassenobjekte, die von der MFC-Erweiterungs-DLL als Teil der normalen statischen Objektkonstruktion initialisiert wurden, bevor DllMain
sie eingegeben wird.
hModule
Ein Handle des MFC-Erweiterungs-DLL-Moduls.
Rückgabewert
TRUE
wenn die MFC-Erweiterungs-DLL erfolgreich initialisiert wird; andernfalls . FALSE
Hinweise
Zum Beispiel:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
...
AfxInitExtensionModule
erstellt eine Kopie des HMODULE der DLL und erfasst die Laufzeitklassen (CRuntimeClass
Strukturen) der DLL und seine Objektfabriken (COleObjectFactory
Objekte) zur späteren Verwendung beim Erstellen des CDynLinkLibrary
Objekts.
MFC-Erweiterungs-DLLs müssen zwei Dinge in ihrer DllMain
Funktion ausführen:
Rufen Sie
AfxInitExtensionModule
den Rückgabewert auf, und überprüfen Sie ihn.Erstellen Sie ein
CDynLinkLibrary
Objekt, wenn die DLL Strukturobjekte exportiertCRuntimeClass
oder über eigene benutzerdefinierte Ressourcen verfügt.
Sie können die MFC-Erweiterungs-DLL aufräumen AfxTermExtensionModule
, wenn jeder Prozess von der MFC-Erweiterungs-DLL getrennt wird (was geschieht, wenn der Prozess beendet wird oder wenn die DLL durch einen AfxFreeLibrary
Aufruf entladen wird).
Anforderungen
Header:<afxdll_.h>
AfxSetAmbientActCtx
Verwenden Sie diese Funktion, um das Statuskennzeichnung pro Modul festzulegen, das sich auf das WinSxS-Verhalten von MFC auswirkt.
Syntax
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Parameter
bSet
Neuer Wert des Modulstatus-Flags.
Hinweise
Wenn das Flag festgelegt ist (die Standardeinstellung) und ein Thread ein MFC-Modul eingibt (siehe AFX_MANAGE_STATE
), wird der Kontext des Moduls aktiviert.
Wenn das Flag nicht festgelegt ist, wird der Kontext des Moduls beim Eintrag nicht aktiviert.
Der Kontext eines Moduls wird anhand seines Manifests bestimmt, häufig in Modulressourcen eingebettet.
Beispiel
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Anforderungen
Header:<afxcomctl32.h>
AfxTermExtensionModule
Rufen Sie diese Funktion auf, damit MFC die MFC-Erweiterungs-DLL bereinigen kann, wenn jeder Prozess von der DLL getrennt wird (was geschieht, wenn der Prozess beendet wird oder wenn die DLL durch einen AfxFreeLibrary
Aufruf entladen wird).
Syntax
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Parameter
state
Ein Verweis auf die AFX_EXTENSION_MODULE
Struktur, die den Status des MFC-Erweiterungs-DLL-Moduls enthält.
bAll
Wenn WAHR, bereinigen Sie alle MFC-Erweiterungs-DLL-Module. Bereinigen Sie andernfalls nur das aktuelle DLL-Modul.
Hinweise
AfxTermExtensionModule
löscht jeden lokalen Speicher, der an das Modul angefügt ist, und entfernt alle Einträge aus dem Nachrichtenzuordnungscache. Zum Beispiel:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
new CMyDynLinkLibrary(NVC_MFC_DLLDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NVC_MFC_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(NVC_MFC_DLLDLL);
}
return 1; // ok
}
Wenn Ihre Anwendung MFC-Erweiterungs-DLLs dynamisch lädt und frei gibt, stellen Sie sicher, dass Sie aufrufen AfxTermExtensionModule
. Da die meisten MFC-Erweiterungs-DLLs nicht dynamisch geladen werden (normalerweise werden sie über ihre Importbibliotheken verknüpft), ist der Aufruf normalerweise AfxTermExtensionModule
nicht erforderlich.
MFC-Erweiterungs-DLLs müssen in ihren DllMain
Aufrufen aufrufenAfxInitExtensionModule
. Wenn die DLL Objekte exportiert CRuntimeClass
oder über eigene benutzerdefinierte Ressourcen verfügt, müssen Sie auch ein CDynLinkLibrary
Objekt in DllMain
erstellen.
Anforderungen
Header:<afxdll_.h>
Siehe auch
Makros und Globalen
AfxMessageBox
Verwalten der Zustandsdaten von MFC-Modulen