Macro's en functies voor het beheren van DLL's

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Naam Description
AFX_EXT_CLASS] Exporteert klassen.
AFX_MANAGE_STATE Een geëxporteerde functie beveiligen in een DLL.
AfxOleInitModule Biedt OLE-ondersteuning van een reguliere MFC-DLL die dynamisch is gekoppeld aan MFC.
AfxNetInitModule Biedt ondersteuning voor MFC Sockets van een reguliere MFC DLL die dynamisch is gekoppeld aan MFC.
AfxGetAmbientActCtx Hiermee haalt u de huidige status van de statusvlag per module op.
AfxGetStaticModuleState Hiermee stelt u de modulestatus in vóór de initialisatie en herstelt u de vorige modulestatus na het opschonen.
AfxInitExtensionModule Initialiseert het DLL-bestand.
AfxSetAmbientActCtx stel de statusvlag per module in, die van invloed is op het WinSxS-gedrag van MFC.
AfxTermExtensionModule Hiermee kan MFC de DLL van de MFC-extensie opschonen wanneer elk proces loskoppelt van het DLL-bestand.

AFX_EXT_CLASS

MFC-extensie-DLL's gebruiken de macro AFX_EXT_CLASS om klassen te exporteren. De uitvoerbare bestanden die zijn gekoppeld aan het DLL-bestand van de MFC-extensie gebruiken de macro om klassen te importeren.

Opmerkingen

Met de AFX_EXT_CLASS macro kunnen dezelfde headerbestand(en) die worden gebruikt om de DLL van de MFC-extensie te bouwen, worden gebruikt met de uitvoerbare bestanden die aan het DLL-bestand zijn gekoppeld.

Voeg in het headerbestand voor uw DLL het AFX_EXT_CLASS trefwoord als volgt toe aan de declaratie van uw klasse:

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Zie Exporteren en importeren met behulp van AFX_EXT_CLASSvoor meer informatie.

Requirements

Header:<afxv_dll.h>

AFX_MANAGE_STATE

Roep deze macro aan om een geëxporteerde functie in een DLL te beveiligen.

Syntaxis

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

Parameterwaarden

pModuleState
Een aanwijzer naar een AFX_MODULE_STATE structuur.

Opmerkingen

Wanneer deze macro wordt aangeroepen, pModuleState is de effectieve modulestatus voor de rest van het bereik dat direct bevat. Wanneer u het bereik verlaat, wordt de vorige effectieve modulestatus automatisch hersteld.

De AFX_MODULE_STATE structuur bevat globale gegevens voor de module, dat wil gezegd het gedeelte van de modulestatus dat wordt gepusht of popped.

MFC gebruikt standaard de resource-handle van de hoofdtoepassing om de resource-sjabloon te laden. Als u een geëxporteerde functie in een DLL hebt, zoals een functie waarmee een dialoogvenster in het DLL-bestand wordt gestart, wordt de resourcesjabloon opgeslagen in de DLL-module. Zorg ervoor dat u de modulestatus wijzigt voor de juiste ingang die moet worden gebruikt. U kunt de status wijzigen door de volgende code toe te voegen aan het begin van de functie:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Met deze macro wordt de huidige modulestatus verwisseld met de status die wordt geretourneerd van AfxGetStaticModuleState tot het einde van het huidige bereik.

Zie De statusgegevens van MFC-modules en Technische notitie 58 beheren voor meer informatie over modulestatussen en MFC.

Opmerking

Wanneer MFC een activeringscontext voor een assembly maakt, wordt deze gebruikt AfxWinInit om de context te maken en AFX_MANAGE_STATE deze te activeren en deactiveren. Houd er ook rekening mee dat AFX_MANAGE_STATE is ingeschakeld voor statische MFC-bibliotheken, evenals MFC-DLL's, zodat MFC-code kan worden uitgevoerd in de juiste activeringscontext die is geselecteerd door het DLL-bestand van de gebruiker. Zie Ondersteuning voor activeringscontexten in de MFC-modulestatus voor meer informatie.

Requirements

Header:<afxstat_.h>

AfxOleInitModule

Voor OLE-ondersteuning van een reguliere MFC DLL die dynamisch is gekoppeld aan MFC, roept u deze functie aan in de functie van CWinApp::InitInstance uw reguliere MFC DLL om de MFC OLE DLL te initialiseren.

Syntaxis

void AFXAPI AfxOleInitModule( );

Opmerkingen

De MFC OLE DLL is een MFC extensie DLL; als u wilt dat een DLL van de MFC-extensie in een CDynLinkLibrary keten wordt bekabeld, moet het een CDynLinkLibrary object maken in de context van elke module die deze gaat gebruiken. AfxOleInitModule maakt het object in de CDynLinkLibrary context van uw reguliere MFC DLL, zodat het wordt bekabeld in de CDynLinkLibrary objectketen van de reguliere MFC DLL.

Als u een OLE-besturingselement bouwt en gebruikt COleControlModule, moet u niet aanroepen AfxOleInitModule omdat de InitInstance lidfunctie voor COleControlModule aanroepen AfxOleInitModule.

Requirements

Koptekst: <afxdll_.h>

AfxNetInitModule

Voor MFC Sockets-ondersteuning van een reguliere MFC DLL die dynamisch is gekoppeld aan MFC, voegt u een aanroep toe aan deze functie in de reguliere MFC DLL-functie CWinApp::InitInstance om de DLL van MFC Sockets te initialiseren.

Syntaxis

void AFXAPI AfxNetInitModule( );

Opmerkingen

De MFC Sockets DLL is een MFC extensie DLL; als u wilt dat een DLL van de MFC-extensie in een CDynLinkLibrary keten wordt bekabeld, moet het een CDynLinkLibrary object maken in de context van elke module die deze gaat gebruiken. AfxNetInitModule maakt het object in de CDynLinkLibrary context van uw reguliere MFC DLL, zodat het wordt bekabeld in de CDynLinkLibrary objectketen van de reguliere MFC DLL.

Requirements

Header:<afxdll_.h>

AfxGetAmbientActCtx

Gebruik deze functie om de huidige status van de statusvlag per module op te halen, wat van invloed is op het WinSxS-gedrag van MFC.

Syntaxis

BOOL AFXAPI AfxGetAmbientActCtx();

Retourwaarde

Huidige waarde markeren met de status van de module.

Opmerkingen

Wanneer de vlag is ingesteld (dit is de standaardinstelling) en een thread een MFC-module invoert (zie AFX_MANAGE_STATE), wordt de context van de module geactiveerd.

Als de vlag niet is ingesteld, wordt de context van de module niet geactiveerd bij het invoeren.

De context van een module wordt bepaald op basis van het manifest, vaak ingesloten in modulebronnen.

Requirements

Header:<afxcomctl32.h>

AfxGetStaticModuleState

Roep deze functie aan om de modulestatus in te stellen vóór initialisatie en om de vorige modulestatus na het opschonen te herstellen.

Syntaxis

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Retourwaarde

Een aanwijzer naar een AFX_MODULE_STATE structuur.

Opmerkingen

De AFX_MODULE_STATE structuur bevat globale gegevens voor de module, dat wil gezegd het gedeelte van de modulestatus dat wordt gepusht of popped.

MFC gebruikt standaard de resource-handle van de hoofdtoepassing om de resource-sjabloon te laden. Als u een geëxporteerde functie in een DLL hebt, zoals een functie waarmee een dialoogvenster in het DLL-bestand wordt gestart, wordt de resourcesjabloon opgeslagen in de DLL-module. Zorg ervoor dat u de modulestatus wijzigt voor de juiste ingang die moet worden gebruikt. U kunt de status wijzigen door de volgende code toe te voegen aan het begin van de functie:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Met deze macro wordt de huidige modulestatus verwisseld met de status die wordt geretourneerd van AfxGetStaticModuleState tot het einde van het huidige bereik.

Zie De statusgegevens van MFC-modules en Technische notitie 58 beheren voor meer informatie over modulestatussen en MFC.

Requirements

Header:<afxstat_.h>

AfxInitExtensionModule

Roep deze functie aan in een MFC-extensie-DLL's DllMain om het DLL-bestand te initialiseren.

Syntaxis

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state,  HMODULE hModule );

Parameterwaarden

state
Een verwijzing naar de AFX_EXTENSION_MODULE structuurstructuur die de status van de DLL-module van de MFC-extensie bevat na de initialisatie. De status bevat een kopie van de runtimeklasseobjecten die zijn geïnitialiseerd door de MFC-extensie-DLL als onderdeel van de normale statische objectconstructie die wordt uitgevoerd voordat DllMain wordt ingevoerd.

hModule
Een ingang van de DLL-module voor de MFC-extensie.

Retourwaarde

TRUE als de DLL van de MFC-extensie is geïnitialiseerd; anders, FALSE.

Opmerkingen

Voorbeeld:

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 maakt een kopie van de HMODULE van het DLL-bestand en legt de runtimeklassen (structuren) van het DLL-bestand enCRuntimeClass ook de objectfabrieken (COleObjectFactory objecten) vast voor later gebruik wanneer het CDynLinkLibrary object wordt gemaakt. MFC-extensie-DLL's moeten twee dingen doen in hun DllMain functie:

  • Roep AfxInitExtensionModule de retourwaarde aan en controleer deze.

  • Maak een CDynLinkLibrary object als het DLL-bestand structuurobjecten exporteert CRuntimeClass of eigen aangepaste resources heeft.

U kunt aanroepen AfxTermExtensionModule om het DLL-bestand van de MFC-extensie op te schonen wanneer elk proces loskoppelt van het DLL-bestand van de MFC-extensie (wat gebeurt wanneer het proces wordt afgesloten of wanneer het DLL-bestand wordt verwijderd door een AfxFreeLibrary aanroep).

Requirements

Header:<afxdll_.h>

AfxSetAmbientActCtx

Gebruik deze functie om de statusvlag per module in te stellen, wat van invloed is op het WinSxS-gedrag van MFC.

Syntaxis

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

Parameterwaarden

bSet
Nieuwe waarde van de modulestatusvlag.

Opmerkingen

Wanneer de vlag is ingesteld (dit is de standaardinstelling) en een thread een MFC-module invoert (zie AFX_MANAGE_STATE), wordt de context van de module geactiveerd. Als de vlag niet is ingesteld, wordt de context van de module niet geactiveerd bij het invoeren. De context van een module wordt bepaald op basis van het manifest, vaak ingesloten in modulebronnen.

Example

BOOL CMFCListViewApp::InitInstance()
{
   AfxSetAmbientActCtx(FALSE);
   // Remainder of function definition omitted.
}

Requirements

Header:<afxcomctl32.h>

AfxTermExtensionModule

Roep deze functie aan om MFC toe te staan het DLL-bestand van de MFC-extensie op te schonen wanneer elk proces loskoppelt van het DLL-bestand (wat gebeurt wanneer het proces wordt afgesloten of wanneer het DLL-bestand wordt verwijderd door een AfxFreeLibrary aanroep).

Syntaxis

void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );

Parameterwaarden

state
Een verwijzing naar de AFX_EXTENSION_MODULE structuur die de status van de DLL-module van de MFC-extensie bevat.

bAll
Als WAAR is, moet u alle DLL-modules van de MFC-extensie opschonen. Anders schoont u alleen de huidige DLL-module op.

Opmerkingen

AfxTermExtensionModule verwijdert alle lokale opslag die aan de module is gekoppeld en verwijdert alle vermeldingen uit de berichtentoewijzingscache. Voorbeeld:

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
}

Als uw toepassing dynamisch MFC-extensie-DLL's laadt en vrijgeeft, moet u het aanroepen AfxTermExtensionModule. Omdat de meeste MFC-extensie-DLL's niet dynamisch worden geladen (normaal gesproken zijn ze gekoppeld via hun importbibliotheken), is de aanroep naar AfxTermExtensionModule meestal niet nodig.

MFC-extensie-DLL's moeten hun aanroepen AfxInitExtensionModuleDllMain. Als de DLL objecten exporteert CRuntimeClass of eigen aangepaste resources heeft, moet u ook een CDynLinkLibrary object maken in DllMain.

Requirements

Header:<afxdll_.h>

Zie ook

Macro's en globals
AfxMessageBox
De statusgegevens van MFC-modules beheren