如果主机进程在WaitFor< ...>上被阻止,则具有重新授予窗口的访客进程会在Dialog调用上挂起。

时间:2014-07-01 10:21:11

标签: windows delphi winapi

我正在为复杂的应用程序开发一个多进程框架。 Host进程充当容器,可以从中生成一个或多个guest虚拟机进程。 这样的客户进程的窗口被重新定位到主机的窗口(例如笔记本tabSheet)。 (InterProcess Communication在这里不是问题 - 它有效) 想象一下类似谷歌Chrome的东西。 我已经阅读了很多关于跨进程重新编写窗口的答案,但我无法弄清楚在这种情况下发生了什么:

  • 我的主机(容器)进程恰好在某些句柄上执行WaitForMultipleObjects;
  • 访客进程调用MessageBox,但挂起。

guest虚拟机进程是否在单独的邮件队列上运行?我错过了什么?

我认为在嵌入访客表单时,我遵循了SetParent的最佳指南:

SetWindowLong(GuestHWnd, GWL_STYLE, GetWindowLong(GuestHWND, GWL_STYLE) and WS_EX_NOPARENTNOTIFY and (not WS_POPUP) or WS_CHILD);
SetParent(GuestHWnd, HostHWnd);
PostMessage(GuestHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
SendMessage(HostHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
SetWindowPos(GuestHWnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);

另请注意,我没有调用任何类型的AttachThreadInput。 如果主机未被阻止,或者访客窗口不是主机的孩子(显然),则不会出现此问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

我只能推荐Raymond chen的解释:http://blogs.msdn.com/b/oldnewthing/archive/2013/04/12/10410454.aspx

长话短说:

  

创建跨线程父/子或所有者/拥有窗口   relationship隐式地附加了线程的输入队列   那些窗户属于。

问题出在这句话中:

  

另请注意,我还没有调用任何类型的AttachThreadInput。该   如果未阻止主机或访客,则不会出现问题   窗口不是主持人的孩子(显然)。

由于它是子/父关系,因此存在隐式的AttachThreadInput。