GetModuleHandle()與GetModuleHandleEx()說明


GetModuleHandle()與GetModuleHandleEx()

這兩個函數都是用於獲取"已經映射到調用進程中"的模塊的句柄。

1.GetModuleHandle(lpModuleName)
lpModuleName是模塊的名稱,可以是**.dll或者**.exe,如果沒有擴展名,則默認為dll.
如果模塊名稱通過路徑來指定,則路徑中必須使用"\",而不是"/".
執行時,該函數通過名稱(大小寫不敏感)來查看調用進程已映射的模塊,返回符合的模塊句柄。

如果GetModuleHandle(NULL),則返回調用進程本身的句柄。

成功,則返回句柄,失敗,返回NULL。錯誤信息:GetLastError()


ps:
GetModuleHandle函數不會增加所指定模塊的引用數,也就是說,不管調用該函數幾次,只要調用一次FreeLibrary函數,該模塊就從進程中卸載了。
在多線程中,模塊句柄在不同線程中不總是有效的。如:當在一個線程中調用了該函數獲取了某一模塊的句柄,但在使用該句柄之前,另一個線程把該句柄
Free了,並重新獲取了其他模塊的句柄。這個時候第一個線程再去使用這個句柄變量,就不再是之前它打算操作的那個模塊了,而是第二個線程修改后的模塊
句柄了。


2.GetModuleHandleEx(dwFlags, lpModuleName, phModule)
dwFlags:
如果是0,則當調用該函數時,模塊的引用計數自動增加,調用者在使用完模塊句柄后,必須調用一次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_PIN,則模塊一直映射在調用該函數的進程中,直到該進程結束,不管調用多少次FreeLibrary
如果是GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,則同GetModuleHandle相同,不增加引用計數
如果是GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,則lpModuleName是模塊中的一個地址

phModule存儲要找的句柄。其他都和GetModuleHandle函數相同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM