共用方式為


用於管理 DLL 的宏和函式

名稱 描述
AFX_EXT_CLASS] 匯出類別。
AFX_MANAGE_STATE 保護 DLL 中匯出的函式。
AfxOleInitModule 從動態連結至 MFC 的一般 MFC DLL 提供 OLE 支援。
AfxNetInitModule 從動態連結至 MFC 的一般 MFC DLL 提供 MFC 通訊端支援。
AfxGetAmbientActCtx 取得每個模組狀態旗標的目前狀態。
AfxGetStaticModuleState 在初始化之前設定模組狀態,並在清除之後還原先前的模組狀態。
AfxInitExtensionModule 初始化 DLL。
AfxSetAmbientActCtx 設定每一模組的狀態旗標,這會影響 MFC 的 WinSxS 行為。
AfxTermExtensionModule 當每個進程與 DLL 中斷連結時,允許 MFC 清除 MFC 擴充 DLL。

AFX_EXT_CLASS

MFC 擴充 DLL 會使用宏 AFX_EXT_CLASS 匯出類別;連結至 MFC 延伸模組 DLL 的可執行檔會使用宏來匯入類別。

備註

AFX_EXT_CLASS使用 宏時,用來建置 MFC 延伸模組 DLL 的相同標頭檔可以與連結至 DLL 的可執行檔搭配使用。

在 DLL 的標頭檔中,將 關鍵字新增 AFX_EXT_CLASS 至 類別的宣告,如下所示:

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

如需詳細資訊,請參閱 使用 匯出和匯入 AFX_EXT_CLASS

需求

Header: < afxv_dll.h>

AFX_MANAGE_STATE

呼叫這個宏來保護 DLL 中匯出的函式。

語法

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

參數

pModuleState
結構的指標 AFX_MODULE_STATE

備註

叫用這個宏時, pModuleState 是包含範圍之其餘部分的有效模組狀態。 離開範圍時,系統會自動還原先前的有效模組狀態。

結構 AFX_MODULE_STATE 包含模組的全域資料,也就是已推送或快顯之模組狀態的部分。

根據預設,MFC 會使用主應用程式的資源控制代碼來載入資源範本。 如果您的 DLL 中有匯出的函式,例如在 DLL 中啟動對話方塊的函式,資源範本會儲存在 DLL 模組中。 請務必切換模組狀態,以便使用正確的控制碼。 您可以將下列程式碼新增至函式的開頭,以切換狀態:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

這個宏會將目前的模組狀態與從 傳回 AfxGetStaticModuleState 到目前範圍結尾的狀態交換。

如需模組狀態和 MFC 的詳細資訊,請參閱 管理 MFC 模組 的狀態資料和技術 附注 58

注意

當 MFC 建立元件的啟用內容時,它會使用 AfxWinInit 來建立內容並 AFX_MANAGE_STATE 加以啟用和停用。 另請注意, AFX_MANAGE_STATE 已針對靜態 MFC 程式庫以及 MFC DLL 啟用,以允許 MFC 程式碼在使用者 DLL 選取的適當啟用內容中執行。 如需詳細資訊,請參閱 MFC 模組狀態 中的啟用內容支援。

需求

Header: < afxstat_.h>

AfxOleInitModule

如需動態連結至 MFC 之一般 MFC DLL 的 OLE 支援,請在一般 MFC DLL 的 CWinApp::InitInstance 函式中呼叫此函式,以初始化 MFC OLE DLL。

語法

void AFXAPI AfxOleInitModule( );

備註

MFC OLE DLL 是 MFC 擴充 DLL;為了讓 MFC 擴充 DLL 連線到 CDynLinkLibrary 鏈結中,它必須在將使用它的每個模組內容中建立 CDynLinkLibrary 物件。 AfxOleInitModuleCDynLinkLibrary在一般 MFC DLL 的內容中建立 物件,使其連線到 CDynLinkLibrary 一般 MFC DLL 的物件鏈結中。

如果您要建置 OLE 控制項並使用 COleControlModule ,則不應該呼叫 AfxOleInitModule ,因為 InitInstance 呼叫 COleControlModuleAfxOleInitModule 的成員函式。

需求

標頭 : < afxdll_.h>

AfxNetInitModule

對於動態連結至 MFC 之一般 MFC DLL 的 MFC 通訊端支援,請在一般 MFC DLL 的函式中新增對這個函式的 CWinApp::InitInstance 呼叫,以初始化 MFC 通訊端 DLL。

語法

void AFXAPI AfxNetInitModule( );

備註

MFC 通訊端 DLL 是 MFC 延伸模組 DLL;為了讓 MFC 擴充 DLL 連線到 CDynLinkLibrary 鏈結中,它必須在將使用它的每個模組內容中建立 CDynLinkLibrary 物件。 AfxNetInitModuleCDynLinkLibrary在一般 MFC DLL 的內容中建立 物件,使其連線到 CDynLinkLibrary 一般 MFC DLL 的物件鏈結中。

需求

Header: < afxdll_.h>

AfxGetAmbientActCtx

使用此函式來取得每個模組狀態旗標的目前狀態,這會影響 MFC 的 WinSxS 行為。

語法

BOOL AFXAPI AfxGetAmbientActCtx();

傳回值

模組狀態旗標目前的值。

備註

設定旗標時(這是預設值),而執行緒會進入 MFC 模組(請參閱 AFX_MANAGE_STATE ),則會啟動模組的內容。

如果未設定旗標,則不會在專案上啟動模組的內容。

模組的內容取決於其資訊清單,通常內嵌在模組資源中。

需求

Header: < afxcomctl32.h>

AfxGetStaticModuleState

呼叫此函式以在初始化之前設定模組狀態,並在清除之後還原先前的模組狀態。

語法

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

傳回值

結構的指標 AFX_MODULE_STATE

備註

結構 AFX_MODULE_STATE 包含模組的全域資料,也就是已推送或快顯之模組狀態的部分。

根據預設,MFC 會使用主應用程式的資源控制代碼來載入資源範本。 如果您的 DLL 中有匯出的函式,例如在 DLL 中啟動對話方塊的函式,資源範本會儲存在 DLL 模組中。 請務必切換模組狀態,以便使用正確的控制碼。 您可以將下列程式碼新增至函式的開頭,以切換狀態:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

這個宏會將目前的模組狀態與從 傳回 AfxGetStaticModuleState 到目前範圍結尾的狀態交換。

如需模組狀態和 MFC 的詳細資訊,請參閱 管理 MFC 模組 的狀態資料和技術 附注 58

需求

Header: < afxstat_.h>

AfxInitExtensionModule

在 MFC 擴充 DLL 的 DllMain 中呼叫此函式,以初始化 DLL。

語法

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

參數

state
結構 結構的參考 AFX_EXTENSION_MODULE ,其中包含初始化之後 MFC 擴充 DLL 模組的狀態。 狀態包含執行時間類別物件的複本,這些物件已由 MFC 擴充 DLL 初始化,做為在輸入之前 DllMain 執行的一般靜態物件建構的一部分。

hModule
MFC 擴充 DLL 模組的控制碼。

傳回值

TRUE 如果已成功初始化 MFC 擴充功能 DLL,則為 ;否則為 FALSE

備註

例如:

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 會建立 DLL 的 HMODULE 複本,並擷取 DLL 的執行時間類別( CRuntimeClass 結構)以及其物件處理站( COleObjectFactory 物件),以便稍後在建立物件時 CDynLinkLibrary 使用。 MFC 擴充 DLL 必須在其 DllMain 函式中執行兩件事:

當每個進程與 MFC 延伸模組 DLL 中斷連結時,您可以呼叫 AfxTermExtensionModule 以清除 MFC 擴充 DLL(當進程結束時發生,或呼叫卸載 AfxFreeLibrary DLL 時)。

需求

Header: < afxdll_.h>

AfxSetAmbientActCtx

使用這個函式來設定每個模組狀態旗標,這些旗標會影響 MFC 的 WinSxS 行為。

語法

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

參數

bSet
模組狀態旗標的新值。

備註

設定旗標時(這是預設值),而執行緒會進入 MFC 模組(請參閱 AFX_MANAGE_STATE ),則會啟動模組的內容。 如果未設定旗標,則不會在專案上啟動模組的內容。 模組的內容取決於其資訊清單,通常內嵌在模組資源中。

範例

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

需求

Header: < afxcomctl32.h>

AfxTermExtensionModule

呼叫此函式,以允許 MFC 在每個進程與 DLL 中斷連結時清除 MFC 擴充 DLL(當進程結束時發生,或呼叫卸載 AfxFreeLibrary DLL 時)。

語法

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

參數

state
結構參考 AFX_EXTENSION_MODULE ,其中包含 MFC 擴充功能 DLL 模組的狀態。

bAll
如果為 TRUE,請清除所有 MFC 擴充功能 DLL 模組。 否則,請只清除目前的 DLL 模組。

備註

AfxTermExtensionModule 將會刪除連結至模組的任何本機儲存體,並從訊息對應快取中移除任何專案。 例如:

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
}

如果您的應用程式以動態方式載入並釋放 MFC 擴充 DLL,請務必呼叫 AfxTermExtensionModule 。 由於大部分的 MFC 擴充 DLL 都不會動態載入(通常透過匯入程式庫連結),所以通常不需要呼叫 AfxTermExtensionModule

MFC 擴充 DLL 需要在其 中 DllMain 呼叫 AfxInitExtensionModule 。 如果 DLL 匯出 CRuntimeClass 物件或有自己的自訂資源,您也需要在 中 DllMain 建立 CDynLinkLibrary 物件。

需求

Header: < afxdll_.h>

另請參閱

宏和全域
AfxMessageBox
管理 MFC 模組的狀態資料