?? 19.8 dllmain函數.txt
字號:
19.8 DIIMain函數
在編寫 DLL程序時,還有一個比較重要的函數: DllMain。通過前面的介紹,我們知道,對可執行模塊來說,其入口函數是 WinMain。而對 DLL來說,其入口函數是 DlIMain,但該函數是可選的。也就是說,在編寫 DLL程序時,可以提供也可以不提供DlIMain函數。如果提供了 DllMain函數,那么當系統加載該 DLL時,就會調用該函數。 DlIMain函數的原型聲明如下所示:
BOOL W工 NAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason , LPVO工 D 1pvReserved) ;
可見, DlIMain函數有三個參數,其含義分別如下所述:
. hinstDLL
動態鏈接庫模塊的句柄。當 DLL初次被加載時,它的句柄會通過此參數傳遞進來。就好像 WinMain函數有一個當前實例句柄參數一樣。因此,在編寫 DLL程序時,如果某些函數需要用到當前 DLL模塊的句柄,那么就可以為該 DLL提供 DllMain函數,然后將通過參數 hinstDLL傳遞進來的模塊句柄保存到一個全局變量中,供其他函數使用。
. fdwReason
一個標記值,用來指示調用該 DLL入口函數的原因。該參數的取值是表 19.2中所列值之一。
表 19.2 fdwReason參數取值
取值DLL PROCESS ATIACH DLL THREAD ATIACH DLL_THREAD_DETACH DLL]ROCESS_DETACH 說明 進程第一次加載 DLL并調用 DI lM ain函數 當前進程正創建一個新線程 線程結束 進程結束
因此,在編寫 DLL程序時,如果提供了 DllMain函數,在此函數中就可以利用 switc h/case語句,對調用該 DLL的每種情況進行判斷,并分別加以處理。
. lpvReserved
保留參數。不需要關心此參數,但可以檢測這個指針值,如果 DLL被動態加載,則
,
730 I脅"
vc..深λ詳解
此參數值為NULL;如果是靜態加載,則此參數值為非NULL。
讀者應注意,如果提供了DllMain函數,那么在此函數中不要進行太復雜的調用。因為在加載該動態鏈接庫時,可能還有一些核心動態鏈接庫沒有被加載。例如,我們自己編寫的某個DLL被加載時, user32.dll或GDI32.dll這兩個核心動態鏈接庫還沒有被加載。前面的內容已經介紹了,程序在運行時,加載程序會依次加載該進程需要的DLL。而我們自己編寫的DLL可能會比較靠前地被加載。如果自己編寫的DlIMain函數需要調用這兩個核心DLL中的某些函數的話,這時就會失敗,從而導致程序終止。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -