2011-09-30 69 views
2

我想從加載我的DLL的進程獲取消息。如何安全地從DLL中掛接消息泵?

我已經試過:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, 0); 

這給了我錯誤的彈出窗口如何「節目X無法啓動,因爲Y.dll從您的系統中缺少」。這就是我在標題中「安全」放置的原因。

我也試過:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, threadId); 

threadId是在我的DLLMain GetCurrentThreadId()結果。 這一個工程,但我沒有得到任何消息的窗口(只是一堆512和1025)。

回答

4

消息與線程和窗口有關,你的DLL可能被進程加載。所以沒有直接的對應關係。

掛鉤另一方面是全局或每線程。

所有這一切意味着您必須選擇是否僅從特定線程或全局(特定桌面中所有進程中的所有線程)發送消息,您將自己篩選出您感興趣的進程。

你的第二個代碼片段是一個線程鉤子。第一個是全局鉤子,你肯定做錯了,因爲成功的鉤子本身不會導致你提到的錯誤信息。

+0

謝謝,這回答了我很多問題。我正在使用需要'hwnd'傳遞消息的wintab庫。線程是否有層次結構,我可以爬上去找到最近的窗口,或者在我的DLL中創建一個隱藏的窗口? –

+0

如果你正在做一個窗口句柄這個複雜的東西,那麼肯定不會鉤住某人的財產。創建你自己的。但請注意,您的窗口必須位於具有消息循環的線程上。所以,如果你足夠幸運,你只需創建一個窗口;否則你需要創建一個帶窗口的後臺線程和一個消息循環。無論如何,這兩種方法都更容易,更可靠。 –

0

我猜你是直接從DLLMain中調用這些函數。您可以從DLLMain安全地調用哪些函數有嚴重的限制,請參閱MSDN documentation on DLLMain

沒有安全和不安全函數的明確列表,但似乎在您的第一個代碼片段中對SetWindowsHookEx的調用正在做一些在DLLMain函數中被禁止的內容,因此DLL無法正確加載。

+0

其實我在DLLMain中使用'CreateThread',然後在回調中調用這段代碼。之後,我有一個基本的消息循環。對不起,我應該澄清一點。 –

+0

我想說,你不能安全地調用DLLMain中的CreateThread,但經過一些研究後,我得出了可以做出的結論,儘管它不被推薦。 :-) –

+0

在這種情況下,第一個示例中對SetWindowsHookEx的調用幾乎肯定不會運行;在你的新線程有機會運行之前,「丟失的DLL」錯誤應該導致進程終止。也許你無意中從DLLMain返回0? –