[COM] Interface refusée dans un activeX
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
Code:
1 2 3 4 5
| void fonctionAppel(pointeurSurObjetA){
HRESULT hr= pointeurSurObjetA->MethodeComObjetA();
} |
avec
Code:
1 2
|
TypeObjetA * pointeurSurObjetA=&ObjetA; |
j'ai alors hr = 0x8001010E RPC_E_WRONG_THREAD
"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);