Bonjour à tous,
j'ai crée une DLL avec VC++ 6 qui implémente un objet, et cet objet appel des méthodes via COM.
Pour préciser, disons que cet objet s'appelle ObjetA, et que la fonction qui m'intéresse s'appelle MethodeComObjetA.
Premier contexte : la DLL fonctionne parfaitement quand je l'utilise dans mon logiciel d'édition :
Logiciel d'édition (Virtools)-->DLL-->ObjetA--> MethodeComObjetA
Mon logiciel se lance, charge la DLL, instance ObjetA, initialize COM puis appelle MethodeComObjetA.
Tout baigne
Second contexte, j'utilise cette DLL dans un activeX et ça marche aussi
Iexplorer-->ComposantActiveX (VirtoolsWebPlayer)-->DLL-->ObjetA-->MethodeComObjetA
InternetExplorer se lance, mon composant active X se charge, charge la DLL, instancie ObjetA, initialise COM puis appelle MethodeComObjetA.
Tout baigne encore une fois.
:Mon problème apparait dans le même contexte d'execution mais avec un autre type d'appel.
En effet, quand j'invoque la MethodeComObjetA à travers une fonction c++, du genre
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void fonctionAppel(pointeurSurObjetA){ HRESULT hr= pointeurSurObjetA->MethodeComObjetA(); }
j'ai alors hr = 0x8001010E RPC_E_WRONG_THREAD
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TypeObjetA * pointeurSurObjetA=&ObjetA;
"The application called an interface that was marshalled for a different thread."
D'après mes recherches, il semblerait que Com refuse d'appeller MethodeComObjetA() car il considère que ce n'est plus le même thread.
Comme je suis pas familier de DCOM, j'aimerais bien comprendre l'origine de ce problème, d'autant plus que dans le premier contexte ce type d'appel passe sans problème...
PS : J'initialise COM avec hr = ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
Partager