Я создал внутрипроцессный COM-объект (DLL), используя ATL. Обратите внимание, что это объект, а не элемент управления (поэтому не имеет окна или пользовательского интерфейса.) Моя проблема заключается в том, что я пытаюсь запустить событие из второго потока и получаю «катастрофический сбой» (0x8000FFFF). Если я запускаю событие из моего основного потока, я не получаю ошибку. Второй поток вызывает CoInitializeEx
, но это не имеет значения. Я использую модель многопоточной обработки, но переключение на Free Threaded не помогает.
Тот факт, что я пытаюсь сделать это из второго потока, очевидно, имеет решающее значение. Есть ли простой способ сделать это, или мне придется реализовать какую-то скрытую форму обмена сообщениями?
Например, в исходном файле моего основного объекта:
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);
}