我在我的应用程序中创建一个CwinThread :: thread,以便访问COM异步CALLBACK函数中的数据。通过CoInitialize(NULL)初始化COM库。 然后当线程使用COM对象的函数时发生错误:
方法调用IOPCAsyncIO2 :: Write失败,错误代码为8001010e
我使用错误查找获取帮助:应用程序正在调用由另一个线程组织的接口 该线程应该是COM线程。 任何想法?
抱歉,几天前没有给你特定的代码。这次我想用伪代码描述我的问题: 第一:在类B中
in class A,func1 r1 = CoInitialize(NULL); then something for judgement
(此类创建为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。当我使用Class B(Thread类)获取CallbackClass的指针时,就会出现问题。 我知道必须有一些我错过了关于我的线程的东西,我需要一些至少一个COM初始化和一个win32线程的示例以及线程如何访问COM的数据。非常感谢。
答案 0 :(得分:1)
所以,你正在发送" raw" COM接口('这个')在另一个线程中编码。这可能是您收到错误的原因。
COM接口指针必须使用COM方法传递(作为方法的参数,因此COM知道它必须将其封送到另一个线程/公寓),而不是通过其他方式。在公寓模型中,您可以将其视为每个COM对象都存在于每个流程中(您不能在另一个流程中使用'这与公寓的规则相同)
您可以使用" COM连接点" (请参阅此处+ google以获取一些解释:An introduction to COM connection points),这类似于COM对象之间的事件。请注意,这可能很复杂。
您也可以自己使用更多低级构造和编组接口指针(使用the CoMarshalInterThreadInterfaceInStream function)。在此处查看另一篇文章:What are the rules for CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream?。我会先试试。