滥用RegisterWindowMessage会导致资源耗尽吗?

sha*_*oth 5 windows winapi

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

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

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

And*_*ers 5

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

没有(记录)方法取消注册消息,所以在你的应用程序退出之后,该注册消息将保留在原子表中,直到重新启动/注销(我不记得该原子表存储的确切位置,窗口站或者终端服务器会话实例)


Bob*_*ore 5

您甚至在向自己发送消息时需要使用RegisterWindowMessage的原因是它可以保护您免受在WM_APP + N范围内广播消息的白痴的影响.

是的,这确实发生了.


小智 5

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

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