Sdílet prostřednictvím


Makra a funkce pro správu knihoven DLL

Název Popis
AFX_EXT_CLASS] Exportuje třídy.
AFX_MANAGE_STATE Chraňte exportovanou funkci v knihovně DLL.
AfxOleInitModule Poskytuje podporu OLE z běžné knihovny MFC DLL, která je dynamicky propojena s mfc.
AfxNetInitModule Poskytuje podporu soketů MFC z běžné knihovny MFC DLL, která je dynamicky propojena s mfc.
AfxGetAmbientActCtx Získá aktuální stav příznaku stavu jednotlivých modulů.
AfxGetStaticModuleState Nastaví stav modulu před inicializací a obnoví předchozí stav modulu po vyčištění.
AfxInitExtensionModule Inicializuje knihovnu DLL.
AfxSetAmbientActCtx nastavte příznak stavu pro jednotlivé moduly, který ovlivňuje chování Prostředí WINSxS mfc.
AfxTermExtensionModule Umožňuje prostředí MFC vyčistit knihovnu DLL rozšíření MFC při odpojení každého procesu od knihovny DLL.

AFX_EXT_CLASS

Knihovny DLL rozšíření MFC používají makro AFX_EXT_CLASS k exportu tříd. Spustitelné soubory, které odkazují na knihovnu DLL rozšíření MFC, používají makro k importu tříd.

Poznámky

AFX_EXT_CLASS Pomocí makra lze stejné hlavičkové soubory, které slouží k sestavení rozšiřující knihovny DLL KNIHOVNY MFC, použít se spustitelnými soubory, které odkazují na knihovnu DLL.

Do souboru hlavičky knihovny DLL přidejte AFX_EXT_CLASS klíčové slovo do deklarace třídy následujícím způsobem:

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

Další informace naleznete v tématu Export a import pomocí AFX_EXT_CLASS.

Požadavky

Header:<afxv_dll.h>

AFX_MANAGE_STATE

Voláním tohoto makra můžete chránit exportovanou funkci v knihovně DLL.

Syntaxe

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

Parametry

pModuleState
Ukazatel na AFX_MODULE_STATE strukturu.

Poznámky

Při vyvolání pModuleState tohoto makra je efektivní stav modulu pro zbytek okamžitého obsahujícího rozsahu. Po opuštění oboru se předchozí stav efektivního modulu automaticky obnoví.

Struktura AFX_MODULE_STATE obsahuje globální data pro modul, tj. část stavu modulu, která se nasdílí nebo přepnula.

Mfc ve výchozím nastavení používá k načtení šablony prostředku popisovač hlavní aplikace. Pokud máte exportovanou funkci v knihovně DLL, například funkci, která spustí dialogové okno v knihovně DLL, je šablona prostředku uložena v modulu DLL. Nezapomeňte přepnout stav modulu, aby se použil správný popisovač. Stav můžete přepnout přidáním následujícího kódu na začátek funkce:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Toto makro prohodí aktuální stav modulu se stavem vráceným AfxGetStaticModuleState do konce aktuálního oboru.

Další informace o stavech modulů a prostředí MFC naleznete v tématu Správa stavových dat modulů MFC a Technická poznámka 58.

Poznámka:

Když MFC vytvoří aktivační kontext pro sestavení, použije AfxWinInit ho k vytvoření kontextu a AFX_MANAGE_STATE k jeho aktivaci a deaktivaci. Všimněte si také, že AFX_MANAGE_STATE je povolena pro statické knihovny MFC a knihovny MFC DLL, aby se kód MFC spustil ve správném kontextu aktivace vybraném knihovnou DLL uživatele. Další informace naleznete v tématu Podpora kontextů aktivace ve stavu modulu MFC.

Požadavky

Header:<afxstat_.h>

AfxOleInitModule

Pro podporu OLE z běžné knihovny MFC DLL, která je dynamicky propojena s MFC, zavolejte tuto funkci v běžné knihovně CWinApp::InitInstance MFC DLL k inicializaci knihovny MFC OLE DLL.

Syntaxe

void AFXAPI AfxOleInitModule( );

Poznámky

KNIHOVNA MFC OLE DLL je rozšiřující knihovna DLL knihovny MFC; Aby knihovna DLL rozšíření MFC dostala kabel do řetězu CDynLinkLibrary , musí vytvořit CDynLinkLibrary objekt v kontextu každého modulu, který ho bude používat. AfxOleInitModuleCDynLinkLibrary vytvoří objekt v normálním kontextu knihovny MFC DLL tak, aby byl připojen k CDynLinkLibrary řetězci objektů běžné knihovny MFC DLL.

Pokud vytváříte ovládací prvek OLE a používáte COleControlModule, neměli byste volat AfxOleInitModule , protože InitInstance členská funkce pro COleControlModule volání AfxOleInitModule.

Požadavky

Hlavička: <afxdll_.h>

AfxNetInitModule

Pro podporu soketů MFC z běžné knihovny MFC DLL, která je dynamicky propojena s MFC, přidejte volání této funkce do běžné funkce KNIHOVNY MFC DLL CWinApp::InitInstance pro inicializaci knihovny MFC Sockets DLL.

Syntaxe

void AFXAPI AfxNetInitModule( );

Poznámky

Knihovna MFC Sockets DLL je rozšiřující knihovna DLL knihovny MFC; Aby knihovna DLL rozšíření MFC dostala kabel do řetězu CDynLinkLibrary , musí vytvořit CDynLinkLibrary objekt v kontextu každého modulu, který ho bude používat. AfxNetInitModuleCDynLinkLibrary vytvoří objekt v normálním kontextu knihovny MFC DLL tak, aby byl připojen k CDynLinkLibrary řetězci objektů běžné knihovny MFC DLL.

Požadavky

Header:<afxdll_.h>

AfxGetAmbientActCtx

Pomocí této funkce získáte aktuální stav příznaku stavu modulu, který ovlivňuje chování prostředí MFC winSxS.

Syntaxe

BOOL AFXAPI AfxGetAmbientActCtx();

Návratová hodnota

Příznak stavu modulu – aktuální hodnota

Poznámky

Pokud je příznak nastaven (což je výchozí) a vlákno vstoupí do modulu MFC (viz AFX_MANAGE_STATE), je aktivován kontext modulu.

Pokud příznak není nastavený, kontext modulu se při zadávání neaktivuje.

Kontext modulu se určuje z jeho manifestu, který je často vložený do prostředků modulu.

Požadavky

Header:<afxcomctl32.h>

AfxGetStaticModuleState

Voláním této funkce nastavíte stav modulu před inicializací a po vyčištění obnovíte předchozí stav modulu.

Syntaxe

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Návratová hodnota

Ukazatel na AFX_MODULE_STATE strukturu.

Poznámky

Struktura AFX_MODULE_STATE obsahuje globální data pro modul, tj. část stavu modulu, která se nasdílí nebo přepnula.

Mfc ve výchozím nastavení používá k načtení šablony prostředku popisovač hlavní aplikace. Pokud máte exportovanou funkci v knihovně DLL, například funkci, která spustí dialogové okno v knihovně DLL, je šablona prostředku uložena v modulu DLL. Nezapomeňte přepnout stav modulu, aby se použil správný popisovač. Stav můžete přepnout přidáním následujícího kódu na začátek funkce:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Toto makro prohodí aktuální stav modulu se stavem vráceným AfxGetStaticModuleState do konce aktuálního oboru.

Další informace o stavech modulů a prostředí MFC naleznete v tématu Správa stavových dat modulů MFC a Technická poznámka 58.

Požadavky

Header:<afxstat_.h>

AfxInitExtensionModule

Voláním této funkce v knihovně DLL DllMain rozšíření MFC inicializujete knihovnu DLL.

Syntaxe

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

Parametry

state
Odkaz na AFX_EXTENSION_MODULE strukturu struktury , která bude obsahovat stav modulu KNIHOVNY DLL rozšíření MFC po inicializaci. Stav zahrnuje kopii objektů třídy runtime, které byly inicializovány knihovnou DLL rozšíření MFC jako součást normální statické objektové konstrukce spuštěné před DllMain vstupem.

hModule
Popisovač modulu KNIHOVNY DLL rozšíření MFC.

Návratová hodnota

TRUEpokud je knihovna DLL rozšíření MFC úspěšně inicializována; v opačném případě . FALSE

Poznámky

Příklad:

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 vytvoří kopii knihovny DLL HMODULE a zachytí třídy runtime (CRuntimeClass struktury) knihovny DLL a také jeho objektové továrny (COleObjectFactory objekty) pro pozdější použití při vytváření objektu CDynLinkLibrary . Knihovny DLL rozšíření MFC musí ve své DllMain funkci provádět dvě věci:

Knihovnu DLL rozšíření MFC můžete volat AfxTermExtensionModule , když se každý proces odpojí od knihovny DLL rozšíření MFC (k čemuž dochází při ukončení procesu nebo při uvolnění knihovny DLL voláním AfxFreeLibrary ).

Požadavky

Header:<afxdll_.h>

AfxSetAmbientActCtx

Tato funkce slouží k nastavení příznaku stavu pro jednotlivé moduly, který ovlivňuje chování prostředí MFC winSxS.

Syntaxe

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

Parametry

bSet
Nová hodnota příznaku stavu modulu

Poznámky

Pokud je příznak nastaven (což je výchozí) a vlákno vstoupí do modulu MFC (viz AFX_MANAGE_STATE), je aktivován kontext modulu. Pokud příznak není nastavený, kontext modulu se při zadávání neaktivuje. Kontext modulu se určuje z jeho manifestu, který je často vložený do prostředků modulu.

Příklad

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

Požadavky

Header:<afxcomctl32.h>

AfxTermExtensionModule

Voláním této funkce povolíte knihovně MFC vyčistit knihovnu DLL rozšíření MFC, když se každý proces odpojí od knihovny DLL (což se stane při ukončení procesu nebo při uvolnění knihovny DLL voláním AfxFreeLibrary ).

Syntaxe

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

Parametry

state
Odkaz na AFX_EXTENSION_MODULE strukturu, která obsahuje stav modulu KNIHOVNY DLL rozšíření MFC.

bAll
Pokud je pravda, vyčistěte všechny moduly KNIHOVNY DLL rozšíření MFC. V opačném případě vyčistěte pouze aktuální modul knihovny DLL.

Poznámky

AfxTermExtensionModule odstraní jakékoli místní úložiště připojené k modulu a odebere všechny položky z mezipaměti mapy zpráv. Příklad:

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
}

Pokud se vaše aplikace načte a uvolní knihovny DLL rozšíření MFC dynamicky, nezapomeňte volat AfxTermExtensionModule. Vzhledem k tomu, že většina rozšiřujících knihoven DLL MFC není dynamicky načtena (obvykle jsou propojené prostřednictvím knihoven importu), AfxTermExtensionModule volání obvykle není nutné.

Knihovny DLL rozšíření MFC musí volat AfxInitExtensionModule v jejich DllMain. Pokud knihovna DLL exportuje CRuntimeClass objekty nebo má vlastní prostředky, musíte také vytvořit CDynLinkLibrary objekt v DllMain.

Požadavky

Header:<afxdll_.h>

Viz také

Makra a globální objekty
AfxMessageBox
Správa stavových dat modulů MFC