OVH Cloud OVH Cloud

IDispatch::Invoke thread safe ?

3 réponses
Avatar
Cyrille Szymanski
Bonjour,

Quelle supposition peut-on faire quant au thread dans lequel
IDispatch::Invoke est exécuté ? Une stratégie de simple callback pour
notifier mon application est-elle saine, ou faut-il passer par un message
pour être certain que l'événement sera traîté par le thread principal ?


Je ne comprends pas vraiment comment IWebBrowser2 est construit. Pour
intercepter les événements tels que DISPID_NAVIGATECOMPLETE2 il faut les
filtrer dans une implémentation de IWebBrowser::Invoke. Par contre,
IDocHostUIHandler possède des callbacks pratiques, comme par exemple
ShowContextMenu() qu'il suffit d'implémenter.

Pourquoi IWebBrowser2 n'a-t-il pas de callbacks ? Il y a bien
DWebBrowserEvents, mais chez moi c'est juste un IDispatch ce qui m'oblige à
utiliser Invoke :
exdisp.h :
DWebBrowserEvents2 : public IDispatch
{
};



D'autre part, soit j'ai du mal à lire la doc, soit elle a quelques erreurs,
par exemple celle de IDocHostUIHandler::ShowContextMenu :

IHTMLElement *pElem;
HRESULT hr;
hr = pdispReserved->QueryInterface(IID_IHTMLElement, (void**)pElem);
// ^^^^^^^^^^^^^^
// C'est plutôt (void**)&pElem non ?
if(SUCCEEDED (hr)) {
BSTR bstr;
pElem->get_tagName(bstr);
// ^^^^^
// Autre erreur ? Je mettrais plutôt &bstr
USES_CONVERSION;
ATLTRACE("TagName:%s\n", OLE2T(bstr));
SysFreeString(bstr);
pElem->Release();
}

Bref tout ça ne m'aide pas à y voir très clair...

Merci pour vos réponses,
--
Cyrille Szymanski

3 réponses

Avatar
Cyrille Szymanski
Cyrille Szymanski wrote in
news::

Quelle supposition peut-on faire quant au thread dans lequel
IDispatch::Invoke est exécuté ?



À grands coups de GetCurrentThreadId() j'ai remarqué que ce code était
exécuté par le thread qui traite la boucle de messages. Une stratégie de
simple callback serait donc saine (dans le doute, j'ai mis la vérification
du threadId en ASSERT).

Est-ce une règle ou cela dépend-il, comme je le suspecte, de l'objet COM en
question ?

Merci pour vos réponses,
--
Cyrille Szymanski
Avatar
mika
"Cyrille Szymanski" wrote in message
news:
D'autre part, soit j'ai du mal à lire la doc, soit elle a quelques


erreurs,
par exemple celle de IDocHostUIHandler::ShowContextMenu :

IHTMLElement *pElem;
HRESULT hr;
hr = pdispReserved->QueryInterface(IID_IHTMLElement, (void**)pElem);
// ^^^^^^^^^^^^^^
// C'est plutôt (void**)&pElem non ?
if(SUCCEEDED (hr)) {
BSTR bstr;
pElem->get_tagName(bstr);
// ^^^^^
// Autre erreur ? Je mettrais plutôt &bstr



Effectivement, il manque les & dans Msdn.
Après, IWebBrowser2 est une interface comme une autre (comme
IDocHostUIHandler), ::ShowContextMenu() est une méthode comme en a aussi
IWebBrowser2.
Avatar
Cyrille Szymanski
"mika" wrote in
news:43fb8061$0$1155$:

D'après ce que je lis dans MSDN, les objets COM doivent suivent
l'"Apartment-Model", j'ai donc la garantie que le code sera exécuté dans le
contexte du thread qui a initialisé le composant (CoInitialize).

J'ai bon ?

Après, IWebBrowser2 est une interface comme une autre (comme
IDocHostUIHandler), ::ShowContextMenu() est une méthode comme en a
aussi IWebBrowser2.



C'est pas tellement IWebBrowser2 qui me gêne, mais plutôt
DWebBrowserEvents2 qui chez moi (VC 7.1) ne contient aucune méthode alors
que la doc en présente.

exdisp.h :
DWebBrowserEvents2 : public IDispatch
{
};

Je suis donc obligé de capturer les événements dans la méthode Invoke ce
qui est moche.

--
Cyrille Szymanski