2010-07-09 60 views
0

我有一個應用程序正在加載一個包含全局GetMessage鉤子的回調函數的庫。我得到該過程並將其傳遞給SetWindowsHookEx以針對所有正在運行的線程進行設置。EXE和Global Hook DLL之間的通信

問題是,我想讓DLL函數在像按鍵這樣的特定情況下告訴原始應用程序退出,而不是所有的應用程序。我能想到的唯一方法是在應用程序中創建一個窗口,並讓DLL調用SendMessage(HWND_BROADCAST)發送應用程序識別退出的自定義消息。但我想驗證這是否是最好的方法來做到這一點?

另一個問題也出現了。比方說,我希望DLL執行一些一次性初始化,例如打開一個文件。如果我在DllMain中這樣做,那麼它會多次執行此操作,因爲它已被多次加載。這是解決這個問題嗎?謝謝。

回答

1

如果一個應用程序內運行您的DLL有很多的方法來識別其中的EXE我目前正在運行。例如,可以使用GetModuleFileName(NULL, ...)來獲取當前進程的可執行文件的路徑。另一種方法是:可以驗證某些資源(如版本資源)在當前進程中是否存在某些特殊值,例如FileDescription(請參閱http://msdn.microsoft.com/en-us/library/ms646981.aspxhttp://msdn.microsoft.com/en-us/library/ms647464.aspx)。

如果你的DLL沒有每個線程初始化一個(像TlsAlloc等),這是一個好主意,打電話DisableThreadLibraryCalls(見http://msdn.microsoft.com/en-us/library/ms682579.aspxhttp://msdn.microsoft.com/en-us/library/ms682596.aspx)的DllMain內是第二個參數是DLL_PROCESS_ATTACH