gpt4 book ai didi

multithreading - VC++ 线程编码和 COM : The application called an interface that was marshalled for a different thread

转载 作者:行者123 更新时间:2023-12-04 06:45:11 24 4
gpt4 key购买 nike

我的基于 VC++ 2005 对话框的应用程序在对话框类中初始化一个 COM 对象,并在工作线程中使用它。

我在应用程序启动和工作线程启动时调用了 CoInitialize(NULL)。但是,当调用 COM 方法时,会出现错误“应用程序调用了为不同线程编码的接口(interface)”。

如果我使用 CoInitializeEx(0,COINIT_MULTITHREADED) 那么我会得到同样的错误信息

请帮我找出根本原因。

谢谢。

最佳答案

您通过调用 CoInitialize(NULL) 创建了两个单线程单元。接口(interface)指针在可用之前必须从一个单元编码到另一个单元。将工作线程初始化为 MTA 并不能解决问题。原始接口(interface)指针仍然是在单线程单元中创建的,因此不是线程安全的。换句话说,您不能直接从线程调用接口(interface)方法。这些调用必须编码到创建接口(interface)的线程。编码接口(interface)指针设置了使这成为可能的管道。

唯一不需要编码的情况是两个线程都是 MTA 时。这几乎是不可能的,如果它创建任何窗口,你的主线程必须是 STA。并且 COM 服务器实际上必须是线程安全的,它们很少是。他们使用注册表中的 ThreadingModel 键来宣传他们需要什么。如果有必要,COM 实际上会创建一个 STA 线程来为服务器找到一个好的归宿。

您必须使用 CoMarshalInterThreadInterfaceInStream() 编码指针以避免错误。这是一个相当不友好的功能,IGlobalInterfaceTable 更容易使用。 COM 服务器也必须支持它,您通常需要一个负责编码(marshal)处理的代理/ stub DLL。如果没有,您将获得 E_NOINTERFACE。

还要注意开销,将工作线程的调用编码到主线程是非常昂贵的,并且取决于主线程的响应速度。换句话说,如果您编写线程是为了加速您的程序或避免阻塞用户界面,那么这实际上是行不通的。这就是“天下没有免费的午餐”原则。

关于multithreading - VC++ 线程编码和 COM : The application called an interface that was marshalled for a different thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com