【问题标题】:How to work with the third party COM object(IOPCDataCallback) created by CWinThread::AfxBeginThread()如何使用由 CWinThread::AfxBeginThread() 创建的第三方 COM 对象(IOPCDataCallback)
【发布时间】:2016-01-26 15:21:51
【问题描述】:

我在我的应用程序中创建了一个 CwinThread::thread 以访问 COM 异步 CALLBACK 函数中的数据。COM 库由 CoInitialize(NULL) 初始化。 那么当线程使用COM对象的函数时,就发生了错误:

方法调用 IOPCAsyncIO2::Write 失败,错误代码 8001010e

我使用 Error Lookup 寻求帮助:应用程序正在调用由另一个线程组织的接口 该线程应该是COM线程。 有什么想法吗?

很抱歉几天前没有给你具体的代码。这次我想用伪代码来描述我的问题: 第一:

in class A,func1 r1 = CoInitialize(NULL); then something for judgement

在B类中(该类创建为winthread,用于访问回调类中的数据,以CallbackClass为例)。

in class A,I initialize the thread by calling 
m_pThread = AfxBeginThread(RUNTIME_CLASS(CTestThread), THREAD_PRIORITY_NORMAL,0,0,NULL);

调用B类的函数

m_pThread->PostThreadMessage(WM_INITIALIZETHREAD, (WPARAM)this, 0);

可以知道,A 类被设置用于编码和建立对话框、B 类和 CallbackClass 之间的关系。 我的问题是:我已经阅读了很多关于 MTA 和 STA 的博客,并且我知道我的 PC 的 HKEY_CLASSES_ROOT 说 ThreadingModel 是 Apartment。当我使用 B 类(线程类)来获取 CallbackClass 的指针时,就会出现问题。 我知道我的线程一定有一些我错过的东西,我需要一些示例,说明至少一个 COM 初始化和一个 win32 线程以及线程如何访问 COM 的数据。非常感谢。

【问题讨论】:

  • 8001010e (RPC_E_WRONG_THREAD) 表示某些代码具有在一个线程上创建的指针(指向对象的 COM 接口)并尝试在另一个线程中调用方法(在此指针上)。这取决于您的特定代码,但您提到回调,这是一个线索。
  • 不只是在线程之间传递 COM 指针。详情请见this article
  • @simon-mourier 非常感谢。我的意思是客户端线程的指针试图调用该方法(该方法是COM对象的接口)。 'CComObject* pCOPCDataCallback; // 指向回调对象的指针 // 使用 ATL 模板创建回调对象的实例 HRESULT hresult; hresult = CComObject::CreateInstance(&pCOPCDataCallback);'接口“STDMETHODIMP COPCDataCallback::OnDataChange()”
  • @IgorTandetnik 感谢您的帮助。真的很有帮助。
  • 很难提供更多帮助。你应该放一个完整的复制代码。

标签: multithreading com


【解决方案1】:

因此,您正在向另一个线程中的代码发送“原始”COM 接口(“this”)。这可能就是您收到错误的原因。

COM 接口指针必须使用 COM 方法传递(作为方法的参数,以便 COM 知道它必须将其编组到另一个线程/单元),而不是通过其他方式。在公寓模型中,您认为它就像每个 COM 对象都存在于每个自己的进程中(您不能在另一个进程中使用 'this',这也是公寓的相同规则)。

您可以使用类似于 COM 对象之间的事件的“COM 连接点”(请参阅​​此处 + google 以获得一些解释:An introduction to COM connection points)。请注意,这可能很复杂。

您还可以自己使用更多低级构造和封送接口指针(使用the CoMarshalInterThreadInterfaceInStream function)。在此处查看另一篇文章:What are the rules for CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream?。我会先试试。

【讨论】:

  • 太棒了!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多