我使用ATL创建了一个进程内COM对象(DLL)。请注意,这是一个对象,而不是控件(所以没有窗口或用户界面。)我的问题是,我试图从第二个线程触发一个事件,并且出现'灾难性故障'(0x8000FFFF)。如果我从主线程中触发事件,那么我不会收到错误。第二个线程调用CoInitializeEx
,但这没有什么区别。我正在使用Apartment线程模型,但切换到Free Threaded并没有帮助。从另一个线程触发COM事件
事实上,我试图从第二个线程做到这一点显然至关重要。有没有简单的方法来做到这一点,或者我将不得不实施一些隐藏窗口的消息传递?
例如,在我的主要对象的源文件:
STDMETHODIMP MyObject::SomeMethod(...)
{
CreateThread(NULL, 0, ThreadProc, this, 0, NULL);
// Succeeds with S_OK
FireEvent(L"Hello, world!");
return S_OK;
}
DWORD WINAPI ThreadProc(LPVOID param)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
MyObject* comObject = reinterpret_cast<MyObject*>(param);
// Fails with 0x8000FFFF
comObject->FireEvent(L"Hello, world!");
}
void MyObject::FireEvent(BSTR str)
{
...
// Returns 0x8000FFFF if called from ThreadProc
// Returns S_OK if called from SomeMethod
pConnection->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
}
非常好的解释。非常感谢你。 – Rob 2009-10-30 07:43:51