Multithreading 具有模态对话框的COM编组问题

Multithreading 具有模态对话框的COM编组问题,multithreading,com,mfc,marshalling,Multithreading,Com,Mfc,Marshalling,我想将在我的C++/MFC8程序的主线程中创建的COM对象传递给另一个线程,并将所有同步留给COM。使用CoMarshalInterThreadInterfaceInStream可以工作——直到用户打开一个模式对话框。对话框打开时,显然所有编组消息都会被拒绝,我有点理解,因为它们可能会造成严重破坏,例如重新进入模式对话框。问题是,其中一个涉及线程的操作应该是从模式对话框触发的,所以如果拒绝只是一个安全措施,我想关闭它 我尝试过的一种方法是使对话框成为非模态,并在主窗口打开时禁用它。事实证明,禁用

我想将在我的C++/MFC8程序的主线程中创建的COM对象传递给另一个线程,并将所有同步留给COM。使用CoMarshalInterThreadInterfaceInStream可以工作——直到用户打开一个模式对话框。对话框打开时,显然所有编组消息都会被拒绝,我有点理解,因为它们可能会造成严重破坏,例如重新进入模式对话框。问题是,其中一个涉及线程的操作应该是从模式对话框触发的,所以如果拒绝只是一个安全措施,我想关闭它

我尝试过的一种方法是使对话框成为非模态,并在主窗口打开时禁用它。事实证明,禁用主窗口也会导致编组失败。这让我特别惊讶,因为接收消息的窗口不是主窗口,而是一个特殊的隐藏窗口(如Microsoft所述)。因此,某些代码必须显式地检查主窗口的“已启用”状态。事实上,我可以看到消息(WM_用户发送到该特殊窗口)到达程序的消息循环中,并通过DispatchMessage继续前进,但随后我就失去了对它们的跟踪

所以我想知道他们下一步会去哪里(结果失望地回来)。我想AfxOleGetMessageFilter可能会把我带到某个地方,但它返回的对象的实现中的断点甚至没有被击中。所以如果有人知道去哪里找,我会非常感激。当然,解决方案的想法也是受欢迎的。(我能想到的最好办法是将对话框设为非模态,然后临时重新启用.Yuk下面的主窗口!)


(如果有人想用一个最小的例子来测试这个,我可以试着想出一个,但不会太小。提前谢谢!)

非常奇怪。与COM对象有关,想不出任何其他原因。谢谢,您非常接近。有人注册了一个消息过滤器,我并没有找到,因为他直接使用了CoRegisterMessageFilter而不是Afx调用。(好吧,如果我只知道1%的代码,我可能不应该说“我的程序”)非常奇怪。与COM对象有关,想不出任何其他原因。谢谢,您非常接近。有人注册了一个消息过滤器,我并没有找到,因为他直接使用了CoRegisterMessageFilter而不是Afx调用。(好吧,如果我只知道1%的代码,我可能不应该说“我的程序”。)