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 COleControlModulemetody , 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

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:

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