我需要這樣做,因爲我在DllMain()
因此,裝載機鎖舉行。我讀過GetModuleHandle()
also uses the loader lock [page #6]這會導致死鎖。一個GetModuleHandle執行
GetModuleHandle()如何實現?一些代碼將是一個加號。
更新:因爲我在WinXP上只使用SetWindowsHookEx
。只要在評論中採納建議,就可以輕鬆地實現,並在第一次調用回調時使用GetModuleHandle()。
我需要這樣做,因爲我在DllMain()
因此,裝載機鎖舉行。我讀過GetModuleHandle()
also uses the loader lock [page #6]這會導致死鎖。一個GetModuleHandle執行
GetModuleHandle()如何實現?一些代碼將是一個加號。
更新:因爲我在WinXP上只使用SetWindowsHookEx
。只要在評論中採納建議,就可以輕鬆地實現,並在第一次調用回調時使用GetModuleHandle()。
您可以撥打GetModuleHandle
從DllMain
。它不加載任何庫並且不增加模塊引用計數。其他故事與LoadLibrary
。切勿從DllMain
撥打電話。
Microsoft文檔暗示'GetModuleHandle()**可以**保持加載程序鎖定。 (頁6)http://msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx – unixman83
只要你停留在dllmain線程中,就可以。裝載機鎖可以重新進入。 –
它確實增加了引用計數,這是鎖必須獲取的原因。查看GetModuleHandleEx()和GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 選項。 –
難道你不能僅僅導出一個'Init'函數來完成所有「危險」的東西,並且在'DllMain'完成之後從外部調用它呢?如果您在'DllMain'中執行復雜的事情,那麼您正在尋找麻煩。 – eran
@eran,沒有與我的API注入模式。這是傳統的'API掛鉤'代碼,以支持WinXP。 – unixman83
嘗試一下簡單的方法,然後再努力嘗試。比方說,如果通過一個特殊的調試開關,只需在目標程序中添加幾行代碼就可以加載DLL。 –