Winapi Win32-CreateDialogParam在WM_INITDIALOG之前或之后返回

Winapi Win32-CreateDialogParam在WM_INITDIALOG之前或之后返回,winapi,dialog,Winapi,Dialog,我通过CreateDialogParam将字符串指针传递给DialogProc。此指针指向在CreateDialogParam返回后立即释放的动态分配内存。是否在CreateDialogParam返回之前处理WM_INITDIALOG 例如: LPWSTR lpStr = malloc( some_size ) CreateDialogParam( ... lpStr ); free( lpStr ); 在DialogProc中: case WM_INITDIALOG: ... do so

我通过CreateDialogParam将字符串指针传递给DialogProc。此指针指向在CreateDialogParam返回后立即释放的动态分配内存。是否在CreateDialogParam返回之前处理WM_INITDIALOG

例如:

LPWSTR lpStr = malloc( some_size )
CreateDialogParam( ... lpStr );
free( lpStr );
在DialogProc中:

case WM_INITDIALOG:
  ... do something with lParam
对。根据,

CreateDialogParam函数使用CreateWindowEx函数创建对话框。CreateDialogParam然后发送WM_INITDIALOG消息。。。到对话框过程

这里最关键的一点是它发送一条消息(而不是发布一条消息)。SendMessage只是直接调用对话框过程。PostMessage会将消息放入队列中

因此,是的,WM_INITDIALOG应该在CreateDialogParam返回之前完成。您可以使用调试器和一些断点来验证这一点。

是。根据,

CreateDialogParam函数使用CreateWindowEx函数创建对话框。CreateDialogParam然后发送WM_INITDIALOG消息。。。到对话框过程

这里最关键的一点是它发送一条消息(而不是发布一条消息)。SendMessage只是直接调用对话框过程。PostMessage会将消息放入队列中

因此,是的,WM_INITDIALOG应该在CreateDialogParam返回之前完成。您可以使用调试器和一些断点来验证这一点

CreateDialogParam函数使用CreateWindowEx函数创建对话框。CreateDialogParam然后向对话框过程发送WM_INITDIALOG消息。如果模板指定WS_可见样式,该函数将显示对话框。最后,CreateDialogParam返回对话框的窗口句柄

这表明WM_INITDIALOG在对话框完成之前被发送到该对话框。但是,在对话框上的窗口消息循环获取消息之前,不会处理此消息。因为您使用的是两个独立的线程,所以不应该依赖于这种行为。如果在窗口消息循环上同步执行缓慢的操作,则可能需要比CreateWindowEx调用的其余部分更长的时间

编辑:根据Joel的回答,文档确实暗示它发送(阻止)消息,而不是发布消息。在依赖任何功能之前,您应该自己测试它。

来自

CreateDialogParam函数使用CreateWindowEx函数创建对话框。CreateDialogParam然后向对话框过程发送WM_INITDIALOG消息。如果模板指定WS_可见样式,该函数将显示对话框。最后,CreateDialogParam返回对话框的窗口句柄

这表明WM_INITDIALOG在对话框完成之前被发送到该对话框。但是,在对话框上的窗口消息循环获取消息之前,不会处理此消息。因为您使用的是两个独立的线程,所以不应该依赖于这种行为。如果在窗口消息循环上同步执行缓慢的操作,则可能需要比CreateWindowEx调用的其余部分更长的时间


编辑:根据Joel的回答,文档确实暗示它发送(阻止)消息,而不是发布消息。在依赖任何功能之前,您应该自己测试它。

这是一条非排队同步消息。不涉及任何消息队列。它是在任何地方显式指定为同步的,还是仅在使用“发送”与“发布”时暗示了这一点?即使是MS有时在术语上也很马虎,当它们的意思是“发布”时可能会说“发送”,但这是一条同步消息。如果排队,系统将无法工作。这是一条非排队同步消息。不涉及任何消息队列。它是在任何地方显式指定为同步的,还是仅在使用“发送”与“发布”时暗示了这一点?即使是MS有时在术语上也很马虎,当它们的意思是“发布”时可能会说“发送”,但这是一条同步消息。如果排队,系统将无法工作。啊,很高兴看到有人了解发送和发布之间的区别。我不确定它所指的
send
是SendMessage还是只是没有定义顺序的口语定义。你关于中断的建议是我早就应该想到的:)对于Windows编程来说,“发送”和“发布”之间的区别是如此重要,以至于编写文档的人都知道这一点!啊,很高兴看到有人能理解发送和发布之间的区别。我不确定它所指的
send
是SendMessage还是只是没有定义顺序的口语定义。你关于中断的建议是我早就应该想到的:)对于Windows编程来说,“发送”和“发布”之间的区别是如此重要,以至于编写文档的人都知道这一点!