0

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

句柄像这样在 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 处理程序。

4

1 回答 1

6

文档说:

[当为句柄传递 NULL 时,它不是指变体 Null,而是指值0]:

该函数的行为类似于对 PostThreadMessage 的调用,其中 dwThreadId 参数设置为当前线程的标识符。

因此,将消息发布到 具有独特的含义0,如果您真的想将消息发送到遗忘中,则不应只允许这样做。如果是这种情况,您宁愿检查句柄是否存在0并且根本不发布消息。

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

于 2013-06-28T12:03:44.020 回答