| 隱式連結 | 顯式連結 |
|---|---|
| 編譯期連結 .lib,啟動時自動載入 | 執行期呼叫 LoadLibrary 手動載入 |
| EXE 含導入表 | EXE 無導入表,不需 .lib |
| 缺 DLL 無法啟動 | 可延遲載入、優雅降級 |
// 1. 載入 DLL
HMODULE hDll = LoadLibraryEx(L"mydll.dll", NULL, 0);
if (!hDll) return ERROR_MOD_NOT_FOUND;
// 2. 取得函式位址
typedef void (CALLBACK *PFN_DUMP)(HMODULE);
PFN_DUMP pfn = (PFN_DUMP)GetProcAddress(hDll, "DumpModule");
if (!pfn) { FreeLibrary(hDll); return ERROR_PROC_NOT_FOUND; }
// 3. 呼叫函式
pfn(hDll);
// 4. 卸載
FreeLibrary(hDll);
LoadLibrary:計數 +1,首次載入才映射映像FreeLibrary:計數 -1,歸零時卸載映像VOID FreeLibraryAndExitThread(HMODULE hDll, DWORD exitCode) {
FreeLibrary(hDll); // 可能卸載含本執行緒代碼的 DLL
ExitThread(exitCode); // 但 Kernel32.dll 仍在,安全返回
}
適用於 DLL 內建立的背景執行緒結束時自我清理。
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, PVOID reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH: // 進程載入(首次)
DisableThreadLibraryCalls(hInst); // 優化:不需要 THREAD 通知
break;
case DLL_THREAD_ATTACH: // 執行緒建立
break;
case DLL_THREAD_DETACH: // 執行緒結束
break;
case DLL_PROCESS_DETACH: // 進程卸載/結束
break;
}
return TRUE;
}
DLL_PROCESS_ATTACH 返回 FALSE 會導致載入失敗、進程終止/BASE 指定不衝突基址,或使用模組繫結bind.exe、VS 連結器 /BIND參考:《Windows 核心編程》第 5 版第 4 部分