首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

DLL 全面剖析(二):MFC 中的 DLL 類型與入口函數詳解

     編輯:VC 教學

MFC DLL 分類體系

MFC 將 DLL 分為三大類,按對 MFC 庫的依賴方式與導出能力劃分:

1. Non-MFC DLL(非 MFC DLL)

  • 純 C 語言實現,不使用 MFC 類庫。
  • 導出函數採用標準 C 接口(extern "C"),可被任何語言調用。
  • 無 MFC 狀態管理需求,體積最小,依賴最少。

2. Regular DLL(常規 DLL)

使用 MFC 類庫,特徵是包含一個繼承自 CWinApp 的類。細分兩種:

類型MFC 鏈接方式特點導出函數要求
靜態鏈接 MFC將 MFC 代碼編譯進 DLL體積大(~200KB+),無外部 MFC DLL 依賴;僅 VC 專業版/企業版支持extern "C" EXPORT ReturnType FuncName();(無需 AFX_MANAGE_STATE)
動態鏈接 MFC運行時載入 MFCx0.dll體積小,需目標機安裝對應 MFC 版本每個導出函數開頭必須加 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 切換模塊狀態

Regular DLL 可被所有支持 DLL 的語言調用,DllMain 由 MFC 提供,無需手寫。

3. Extension DLL(擴展 DLL)

  • 專為導出「繼承自 MFC 的類」設計,實現類庫複用。
  • 導出函數/類僅能被「動態鏈接 MFC」的 MFC 應用程序使用。
  • 無 CWinApp 派生對象,必須手寫 DllMain。
  • 初始化流程:
    1. DllMain 中調用 AfxInitExtensionModule,檢查返回值。
    2. 若需導出 CRuntimeClass 或資源,需導出初始化函數,在其中構造 CDynLinkLibrary 對象。
    3. 宿主應用在 InitInstance 中調用該初始化函數。

DLL 入口函數詳解

1. DllMain(默認入口)

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:  // 進程載入 DLL
            // 初始化:分配 TLS、載入資源、創建全局對象
            break;
        case DLL_THREAD_ATTACH:   // 線程載入 DLL
            // 線程級初始化(較少用)
            break;
        case DLL_THREAD_DETACH:   // 線程卸載 DLL
            // 線程級清理
            break;
        case DLL_PROCESS_DETACH:  // 進程卸載 DLL
            // 釋放資源、銷毀全局對象
            break;
    }
    return TRUE;
}

參數說明:

  • hModule:DLL 模塊句柄(實際為 _DGROUP 區段選擇子)。
  • ul_reason_for_call:調用原因標志。
  • lpReserved:保留參數。

注意:TerminateProcess/TerminateThread 強制結束時不會調用 DllMain(DETACH),資源可能泄漏。

2. _DllMainCRTStartup(CRT 入口)

若使用 C 運行庫(CRT)DLL 版本(多線程),必須指定入口為 _DllMainCRTStartup,實際初始化函數仍為 DllMain。其職責:

  • 進程/線程 Attach 時:初始化 CRT 數據區、構造全局 C++ 對象。
  • 進程/線程 Detach 時:清理 CRT 數據、析構全局 C++ 對象。
  • 調用 DllMain 與 RawDllMain(MFC 擴展 DLL 靜態鏈接時需要)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved