2011-09-14 70 views
1

我需要這樣做,因爲我在DllMain()因此,裝載機鎖舉行。我讀過GetModuleHandle()also uses the loader lock [page #6]這會導致死鎖。一個GetModuleHandle執行

GetModuleHandle()如何實現?一些代碼將是一個加號。

更新:因爲我在WinXP上只使用SetWindowsHookEx。只要在評論中採納建議,就可以輕鬆地實現,並在第一次調用回調時使用GetModuleHandle()。

+0

難道你不能僅僅導出一個'Init'函數來完成所有「危險」的東西,並且在'DllMain'完成之後從外部調用它呢?如果您在'DllMain'中執行復雜的事情,那麼您正在尋找麻煩。 – eran

+0

@eran,沒有與我的API注入模式。這是傳統的'API掛鉤'代碼,以支持WinXP。 – unixman83

+0

嘗試一下簡單的方法,然後再努力嘗試。比方說,如果通過一個特殊的調試開關,只需在目標程序中添加幾行代碼就可以加載DLL。 –

回答

0

您可以撥打GetModuleHandleDllMain。它不加載任何庫並且不增加模塊引用計數。其他故事與LoadLibrary。切勿從DllMain撥打電話。

+0

Microsoft文檔暗示'GetModuleHandle()**可以**保持加載程序鎖定。 (頁6)http://msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx – unixman83

+1

只要你停留在dllmain線程中,就可以。裝載機鎖可以重新進入。 –

+2

它確實增加了引用計數,這是鎖必須獲取的原因。查看GetModuleHandleEx()和GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 選項。 –