2009-07-28 92 views
5

MSDN建議RegisterWindowMessage()函數僅用於註冊要在進程之間發送的消息。如果需要在一個進程內發送消息,可以從WM_APP到0xBFFF範圍內安全地選擇它。濫用RegisterWindowMessage會導致資源耗盡嗎?

但是在我們的代碼庫中,我經常看到RegisterWindowMessage()用於僅在一個進程內發送的消息。我想這是因爲使用RegisterWindowMessage()的簡單性,因爲它不需要在WM_APP..0xBFFF範圍內手動分發消息標識符。

我是否正確理解,如果許多應用程序在一臺機器上運行,並且它們都使用不同的字符串調用RegisterWindowMessage(),則可能會耗盡RegisterWindowMessage()允許返回的消息標識符的範圍,對於其中的一些返回一個表示失敗的值?在WM_APP..0xBFFF範圍消息足夠的情況下,使用RegisterWindowMessage()消息的有效原因是什麼?

回答

4

恕我直言有使用RegisterWindowMessage如果你只將消息發送到自己沒有正當理由

沒有(文件)的方式來註銷的消息,讓您的應用程序退出後,該註冊信息將留在原子表中,直到重新啓動/註銷(我不記得這個原子表存儲的確切位置,窗口站或終端服務器會話實例可能)

5

您需要使用RegisterWindowMessage即使發送消息給自己的原因是它可以保護你免受廣播WM_APP + N範圍內的消息的白癡。

是的,這確實發生了。

3

一個可能的優點是Spy ++可以顯示更多信息文本,因此調試更容易一些。比較

<00058> 00330CA2 S message:0x0419 [User-defined:WM_USER+25] wParam:00000000 lParam:00000000 

<00129> 004F0DA0 S message:0xC2B0 [Registered:"AFX_WM_ONCHANGE_ACTIVE_TAB"] wParam:00000001 lParam:02B596E8 

當然,原則上有用完的消息ID的機會。另一方面,在MFC Feature Pack的源代碼中,有52個調用RegisterWindowMessage。所以還有其他應用程序剩餘的16300個ID。

5

濫用RegisterWindowMessage可能會使窗口框變得不可用。如果窗口消息名稱是動態生成的並且一個錯誤會導致失控窗口消息分配,則尤其如此。在這種情況下,Windows Station /桌面中的全局原子表將被填滿,並且任何使用User32.dll(基本上,任何應用程序)的進程將無法啓動,創建窗口等。

有一個bug Delphi/Borland產品,用於註冊以ControlOfsXXXXXX開頭的消息,其中XXXX是內存地址(或其他動態修改器)。頻繁啓動和停止的應用程序將註冊多個ControlOfsXXXX原子,並最終耗盡原子空間。有關詳細信息,請參閱:

http://blogs.msdn.com/b/ntdebugging/archive/2012/01/31/identifying-global-atom-table-leaks.aspx

而且

https://forums.embarcadero.com/thread.jspa?threadID=47678

+0

不知道在C++ Builder中/德爾福這個bug!討厭... – 2012-03-22 22:13:01