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. AfxOleInitModule
CDynLinkLibrary
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. AfxNetInitModule
CDynLinkLibrary
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
TRUE
pokud 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:
Zavolejte
AfxInitExtensionModule
a zkontrolujte vrácenou hodnotu.Vytvořte objekt,
CDynLinkLibrary
pokud knihovna DLL exportujeCRuntimeClass
objekty Struktury nebo má vlastní prostředky.
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