【发布时间】: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