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 AfxOleInitModulewird.

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

TRUEwenn 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 exportiert CRuntimeClass 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 DllMainAufrufen aufrufenAfxInitExtensionModule. Wenn die DLL Objekte exportiert CRuntimeClass oder über eigene benutzerdefinierte Ressourcen verfügt, müssen Sie auch ein CDynLinkLibrary Objekt in DllMainerstellen.

Anforderungen

Header:<afxdll_.h>

Siehe auch

Makros und Globalen
AfxMessageBox
Verwalten der Zustandsdaten von MFC-Modulen