我使用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