Makra i funkcje do zarządzania bibliotekami DLL
Nazwa/nazwisko | opis |
---|---|
AFX_EXT_CLASS ] |
Eksportuje klasy. |
AFX_MANAGE_STATE |
Ochrona wyeksportowanej funkcji w bibliotece DLL. |
AfxOleInitModule |
Zapewnia obsługę OLE ze standardowej biblioteki MFC DLL, która jest dynamicznie połączona z MFC. |
AfxNetInitModule |
Zapewnia obsługę gniazd MFC ze standardowej biblioteki MFC DLL, która jest dynamicznie połączona z MFC. |
AfxGetAmbientActCtx |
Pobiera bieżący stan flagi stanu modułu. |
AfxGetStaticModuleState |
Ustawia stan modułu przed zainicjowaniem i przywraca poprzedni stan modułu po oczyszczeniu. |
AfxInitExtensionModule |
Inicjuje bibliotekę DLL. |
AfxSetAmbientActCtx |
ustaw flagę stanu modułu, która wpływa na zachowanie środowiska WinSxS MFC. |
AfxTermExtensionModule |
Umożliwia MFC czyszczenie biblioteki DLL rozszerzenia MFC, gdy każdy proces odłącza się od biblioteki DLL. |
AFX_EXT_CLASS
Biblioteki DLL rozszerzeń MFC używają makra do eksportowania klas; pliki wykonywalne łączące się z biblioteką DLL rozszerzenia MFC używają makra AFX_EXT_CLASS
do importowania klas.
Uwagi
W makrze AFX_EXT_CLASS
te same pliki nagłówkowe używane do kompilowania biblioteki DLL rozszerzenia MFC mogą być używane z plikami wykonywalnymi, które łączą się z biblioteką DLL.
W pliku nagłówkowym biblioteki DLL dodaj AFX_EXT_CLASS
słowo kluczowe do deklaracji klasy w następujący sposób:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Aby uzyskać więcej informacji, zobacz Eksportowanie i importowanie przy użyciu polecenia AFX_EXT_CLASS
.
Wymagania
Header:<afxv_dll.h>
AFX_MANAGE_STATE
Wywołaj to makro, aby chronić wyeksportowaną funkcję w bibliotece DLL.
Składnia
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Parametry
pModuleState
Wskaźnik do AFX_MODULE_STATE
struktury.
Uwagi
Po wywołaniu pModuleState
tego makra jest efektywnym stanem modułu dla pozostałej części najbliższego zakresu zawierającego. Po opuszczeniu zakresu poprzedni stan skutecznego modułu zostanie automatycznie przywrócony.
Struktura AFX_MODULE_STATE
zawiera dane globalne modułu, czyli część stanu modułu, który jest wypychany lub zwinięty.
Domyślnie MFC używa dojścia zasobów głównej aplikacji do załadowania szablonu zasobu. Jeśli masz wyeksportowaną funkcję w bibliotece DLL, taką jak ta, która uruchamia okno dialogowe w bibliotece DLL, szablon zasobu jest przechowywany w module DLL. Pamiętaj, aby przełączyć stan modułu, aby można było użyć poprawnego dojścia. Stan można przełączyć, dodając następujący kod na początku funkcji:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
To makro zamienia bieżący stan modułu ze stanem zwróconym z AfxGetStaticModuleState
do końca bieżącego zakresu.
Aby uzyskać więcej informacji na temat stanów modułów i MFC, zobacz Managing the state data of MFC modules and Technical Note 58 (Zarządzanie danymi o stanie modułów MFC i Uwaga techniczna 58).
Uwaga
Gdy MFC tworzy kontekst aktywacji dla zestawu, używa AfxWinInit
go do utworzenia kontekstu i AFX_MANAGE_STATE
aktywowania i dezaktywowania. Należy również pamiętać, że AFX_MANAGE_STATE
jest włączona dla statycznych bibliotek MFC, a także bibliotek DLL MFC, aby umożliwić wykonywanie kodu MFC w odpowiednim kontekście aktywacji wybranym przez bibliotekę DLL użytkownika. Aby uzyskać więcej informacji, zobacz Obsługa kontekstów aktywacji w stanie modułu MFC.
Wymagania
Header:<afxstat_.h>
AfxOleInitModule
Aby uzyskać obsługę OLE ze standardowej biblioteki MFC DLL, która jest dynamicznie połączona z MFC, wywołaj tę funkcję w funkcji zwykłego biblioteki MFC DLL CWinApp::InitInstance
, aby zainicjować bibliotekę MFC OLE DLL.
Składnia
void AFXAPI AfxOleInitModule( );
Uwagi
Biblioteka MFC OLE DLL jest biblioteką DLL rozszerzenia MFC; aby biblioteka DLL rozszerzenia MFC była podłączana do CDynLinkLibrary
łańcucha, musi utworzyć obiekt w kontekście każdego modułu, który będzie go używać CDynLinkLibrary
. AfxOleInitModule
program CDynLinkLibrary
tworzy obiekt w kontekście zwykłego biblioteki MFC DLL, dzięki czemu jest podłączony do CDynLinkLibrary
łańcucha obiektów regularnej biblioteki MFC DLL.
Jeśli tworzysz kontrolkę OLE i używasz COleControlModule
metody , nie należy wywoływać AfxOleInitModule
funkcji składowej InitInstance
dla COleControlModule
wywołań AfxOleInitModule
.
Wymagania
Nagłówek: <afxdll_.h>
AfxNetInitModule
W przypadku obsługi gniazd MFC z regularnej biblioteki MFC DLL, która jest dynamicznie połączona z MFC, dodaj wywołanie tej funkcji w funkcji zwykłego biblioteki MFC DLL CWinApp::InitInstance
, aby zainicjować bibliotekę DLL MFC Sockets.
Składnia
void AFXAPI AfxNetInitModule( );
Uwagi
Biblioteka DLL MFC Sockets jest biblioteką DLL rozszerzenia MFC; aby biblioteka DLL rozszerzenia MFC była podłączana do CDynLinkLibrary
łańcucha, musi utworzyć obiekt w kontekście każdego modułu, który będzie go używać CDynLinkLibrary
. AfxNetInitModule
program CDynLinkLibrary
tworzy obiekt w kontekście zwykłego biblioteki MFC DLL, dzięki czemu jest podłączony do CDynLinkLibrary
łańcucha obiektów regularnej biblioteki MFC DLL.
Wymagania
Header:<afxdll_.h>
AfxGetAmbientActCtx
Użyj tej funkcji, aby uzyskać bieżący stan flagi stanu modułu, która wpływa na zachowanie środowiska WinSxS MFC.
Składnia
BOOL AFXAPI AfxGetAmbientActCtx();
Wartość zwracana
Bieżąca wartość flagi stanu modułu.
Uwagi
Po ustawieniu flagi (która jest domyślna), a wątek wchodzi do modułu MFC (zobacz AFX_MANAGE_STATE
), kontekst modułu jest aktywowany.
Jeśli flaga nie jest ustawiona, kontekst modułu nie jest aktywowany podczas wprowadzania.
Kontekst modułu jest określany na podstawie manifestu, często osadzonego w zasobach modułu.
Wymagania
Header:<afxcomctl32.h>
AfxGetStaticModuleState
Wywołaj tę funkcję, aby ustawić stan modułu przed zainicjowaniem i przywrócić poprzedni stan modułu po oczyszczeniu.
Składnia
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Wartość zwracana
Wskaźnik do AFX_MODULE_STATE
struktury.
Uwagi
Struktura AFX_MODULE_STATE
zawiera dane globalne modułu, czyli część stanu modułu, który jest wypychany lub zwinięty.
Domyślnie MFC używa dojścia zasobów głównej aplikacji do załadowania szablonu zasobu. Jeśli masz wyeksportowaną funkcję w bibliotece DLL, taką jak ta, która uruchamia okno dialogowe w bibliotece DLL, szablon zasobu jest przechowywany w module DLL. Pamiętaj, aby przełączyć stan modułu, aby można było użyć poprawnego dojścia. Stan można przełączyć, dodając następujący kod na początku funkcji:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
To makro zamienia bieżący stan modułu ze stanem zwróconym z AfxGetStaticModuleState
do końca bieżącego zakresu.
Aby uzyskać więcej informacji na temat stanów modułów i MFC, zobacz Managing the state data of MFC modules and Technical Note 58 (Zarządzanie danymi o stanie modułów MFC i Uwaga techniczna 58).
Wymagania
Header:<afxstat_.h>
AfxInitExtensionModule
Wywołaj tę funkcję w bibliotece DLL DllMain
rozszerzenia MFC, aby zainicjować bibliotekę DLL.
Składnia
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Parametry
state
Odwołanie do AFX_EXTENSION_MODULE
struktury Struktury , która będzie zawierać stan modułu DLL rozszerzenia MFC po zainicjowaniu. Stan zawiera kopię obiektów klasy środowiska uruchomieniowego, które zostały zainicjowane przez bibliotekę DLL rozszerzenia MFC w ramach normalnej konstrukcji obiektów statycznych wykonanych przed DllMain
wejściem.
hModule
Uchwyt modułu DLL rozszerzenia MFC.
Wartość zwracana
TRUE
jeśli biblioteka DLL rozszerzenia MFC została pomyślnie zainicjowana; w przeciwnym razie, FALSE
.
Uwagi
Na przykład:
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
Tworzy kopię HMODULE biblioteki DLL i przechwytuje klasy uruchomieniowe biblioteki DLL (CRuntimeClass
struktury), a także jego fabryki obiektów (COleObjectFactory
obiekty) do późniejszego CDynLinkLibrary
użycia podczas tworzenia obiektu.
Biblioteki DLL rozszerzeń MFC muszą wykonywać dwie czynności w swojej DllMain
funkcji:
Wywołaj
AfxInitExtensionModule
metodę i sprawdź wartość zwracaną.CDynLinkLibrary
Utwórz obiekt, jeśli biblioteka DLL będzie eksportowaćCRuntimeClass
obiekty struktury lub ma własne zasoby niestandardowe.
Można wywołać AfxTermExtensionModule
metodę czyszczenia biblioteki DLL rozszerzenia MFC, gdy każdy proces odłącza się od biblioteki DLL rozszerzenia MFC (co dzieje się w przypadku zakończenia procesu lub zwolnienia biblioteki DLL przez AfxFreeLibrary
wywołanie).
Wymagania
Header:<afxdll_.h>
AfxSetAmbientActCtx
Użyj tej funkcji, aby ustawić flagę stanu modułu, która wpływa na zachowanie środowiska MFC w systemie WinSxS.
Składnia
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Parametry
bSet
Nowa wartość flagi stanu modułu.
Uwagi
Po ustawieniu flagi (która jest domyślna), a wątek wchodzi do modułu MFC (zobacz AFX_MANAGE_STATE
), kontekst modułu jest aktywowany.
Jeśli flaga nie jest ustawiona, kontekst modułu nie jest aktywowany podczas wprowadzania.
Kontekst modułu jest określany na podstawie manifestu, często osadzonego w zasobach modułu.
Przykład
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Wymagania
Header:<afxcomctl32.h>
AfxTermExtensionModule
Wywołaj tę funkcję, aby umożliwić MFC wyczyszczenie biblioteki DLL rozszerzenia MFC, gdy każdy proces odłącza się od biblioteki DLL (co ma miejsce, gdy proces zakończy się lub gdy biblioteka DLL zostanie zwolniona przez AfxFreeLibrary
wywołanie).
Składnia
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Parametry
state
Odwołanie do AFX_EXTENSION_MODULE
struktury zawierającej stan modułu DLL rozszerzenia MFC.
bAll
Jeśli wartość TRUE, wyczyść wszystkie moduły DLL rozszerzenia MFC. W przeciwnym razie wyczyść tylko bieżący moduł DLL.
Uwagi
AfxTermExtensionModule
spowoduje usunięcie dowolnego magazynu lokalnego dołączonego do modułu i usunięcie wszystkich wpisów z pamięci podręcznej mapy komunikatów. Na przykład:
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
}
Jeśli aplikacja ładuje biblioteki DLL rozszerzeń MFC i zwalnia je dynamicznie, pamiętaj, aby wywołać metodę AfxTermExtensionModule
. Ponieważ większość bibliotek DLL rozszerzeń MFC nie jest ładowana dynamicznie (zwykle są one połączone za pośrednictwem bibliotek importu), wywołanie AfxTermExtensionModule
zwykle nie jest konieczne.
Biblioteki DLL rozszerzeń MFC muszą wywoływać AfxInitExtensionModule
w pliku DllMain
. Jeśli biblioteka DLL eksportuje CRuntimeClass
obiekty lub ma własne zasoby niestandardowe, należy również utworzyć CDynLinkLibrary
obiekt w programie DllMain
.
Wymagania
Header:<afxdll_.h>
Zobacz też
Makra i globalne
AfxMessageBox
Zarządzanie danymi stanu modułów MFC