对于0为0的句柄,PostMessage调用是否安全?

时间:2013-06-28 11:56:22

标签: delphi postmessage

我有一个带有HWND句柄的数据模块,可以接收PostMessage调用。

句柄在DataModuleCreate中分配如此(TTNONVISUAL 定义):

{$IFNDEF TTNONVISUAL}
FHWND := AllocateHWND(WindProc);
{$ELSE}
FHWND := 0;
{$ENDIF}

数据模块也用于非可视化程序,其中定义了TTNONVISUAL

数据模块中的WindProc包含在{$ IFNDEF TTNONVISUAL}中,因此在非可视程序中没有WindProc和FHWND = 0

在该程序中,对这个0句柄进行PostMessage调用是否安全?

注意:PostMessage不会发送任何其他数据:
PostMessage的(FHWND,WM_SYNC_PROGRESS,0,0)
和WM_SYNC_PROGRESS是WM_USER + 111,没有其他WM_SYNC_PROGRESS处理程序。

1 个答案:

答案 0 :(得分:6)

documentation says

[为句柄传递NULL时,它不引用变量Null,但实际上是值0]:

  

该函数的行为就像调用PostThreadMessage一样   dwThreadId参数设置为当前线程的标识符。

因此,将消息发布到0具有明显的含义,如果您确实想要将消息置于遗忘状态,则不应该只允许这样做。如果是这种情况,您宁愿检查句柄是否为0而不是发布消息。

但请注意,即使在非可视化应用程序中,创建窗口也是完全合法的。这样的句柄用于发送消息。它们不一定指向可见窗口。实际上,这正是AllocateHWND的用途。它用于非视觉控制(如TTimer),毕竟需要能够接收消息。