可以滥用RegisterWindowMessage导致资源耗尽?

MSDNbuild议RegisterWindowMessage()函数仅用于注册在进程之间发送的消息。 如果需要在一个进程内发送消息,可以从WM_APP到0xBFFF范围内安全地select。

然而,在我们的代码库中,我经常看到RegisterWindowMessage()用于仅在一个进程内发送的消息。 我想这是因为使用RegisterWindowMessage()的感觉简单,因为它不需要在WM_APP..0xBFFF范围内手动分发消息标识符。

我是否正确理解,如果许多应用程序在一台机器上运行,并且它们都使用不同的string调用RegisterWindowMessage(),则可能会耗尽RegisterWindowMessage()允许返回的消息标识符的范围,并且对于其中的一些,失败? 在WM_APP..0xBFFF范围消息足够的情况下,使用RegisterWindowMessage()消息的原因是什么?

Solutions Collecting From Web of "可以滥用RegisterWindowMessage导致资源耗尽?"

恕我直言,没有正当理由使用RegisterWindowMessage如果你只是发送消息给自己

没有(记录)的方式来注销消息,所以在你的应用程序退出后,注册的消息将保留在原子表中,直到重新启动/注销(我不记得这个原子表存储在哪里,窗口站或可能是终端服务器会话实例)

即使在向自己发送消息时,也需要使用RegisterWindowMessage的原因是,它可以保护您免受广播WM_APP + N范围消息的白痴的注意。

是的,这确实发生。

滥用RegisterWindowMessage可能会使窗口框变得不可用。 如果窗口消息名称是动态生成的,并且一个错误会导致失控窗口消息分配,则尤其如此。 在这种情况下,您的Windows工作站/桌面中的全局原子表将被填满,使用User32.dll(基本上,任何应用程序)的任何进程将无法启动,创建窗口等。

Delphi / Borland产品中存在一个bug,它记录了以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

一个可能的优点是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。