J'ai créé un objet COM (DLL) in-process en utilisant ATL. Notez qu'il s'agit d'un objet et non d'un contrôle (donc pas de fenêtre ou d'interface utilisateur). Mon problème est que j'essaie de déclencher un événement à partir d'un deuxième thread et que je reçois un 'Catastrophic failure' (0x8000FFFF). Si je tire l'événement de mon thread principal, alors je ne reçois pas l'erreur. Le deuxième thread appelle CoInitializeEx
mais cela ne fait aucune différence. J'utilise le modèle de thread d'appartement, mais passer à Free Threaded n'aide pas.Exécution d'un événement COM à partir d'un autre thread
Le fait que j'essaie de le faire à partir d'un deuxième fil est évidemment crucial. Existe-t-il un moyen facile de le faire ou vais-je devoir mettre en place une forme de messagerie à fenêtre cachée?
Par exemple, dans mon fichier source de l'objet principal:
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);
}
Très bonne explication. Merci beaucoup. – Rob