Quelques questions sur l'utilisation CComPtr (lors de l'utilisation Release()? Puis-je retourner CComPtr?, ...)

J'ai écrit des add-on pour Internet Explorer(BHO) et je suis en utilisant CComPtr des pointeurs intelligents. Je me demande:

    1. Quand dois-je utiliser CComPtr.Release() de la fonction?

Dans ce cette lien il est utilisé pour libérer les
l'objet de navigateur. Où dois-je l'utiliser? En "normal" d'utilisation (avec mes propres classes) je n'ai pas besoin. Devrais-je l'utiliser dans cette situation:
Je reçois objet d'un document à l'aide de m_spWebBrowser->get_Document(&spDispDoc):

vide STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pdisp n', VARIANTE *pvarURL) 
{ 
//Requête pour l'interface IWebBrowser2. 
CComQIPtr spTempWebBrowser = pdisp n'; 

//Est-ce un événement associé avec le haut-niveau du navigateur? 
si (spTempWebBrowser && m_spWebBrowser && 
m_spWebBrowser.IsEqualObject(spTempWebBrowser)) 
{ 
//Récupérer l'objet de document en cours de navigateur... 
CComPtr spDispDoc; 
hr = m_spWebBrowser->get_Document(&spDispDoc); 
si (RÉUSSI(hr)) 
{ 
//...et requête pour un document HTML. 
CComQIPtr htmlDoc2 = spDispDoc; 
m_spHTMLDocument = spHTMLDoc; 
} 
} 

} 

Dois-je libérer spHTMLDocument dans SetSite fonction comme je le fais avec m_spWebBrowser (comme dans le lien ci-avant)?

    1. Puis-je retourner CComPtr à partir d'une fonction en toute sécurité?

Je veux dire comme ceci:

CComPtr getObjects(CComQIPtr<IHTMLDocument3> htmlDoc3) 
{ 
CComPtr objets; 
hr = htmlDoc3->getElementsByTagName(CComBSTR(L ' "objet"), &objets); 
si(RÉUSSI(rh) && objets != NULL) 
{ 
de retour des objets; 
} 
return NULL; 
} 
    1. Ne devrais-je pas utiliser une forme normale?

Dans le lien précédent RemoveImages privé fonction est déclarée de cette façon:

vide RemoveImages(IHTMLDocument2 *pDocument);

mais invoqué avec pointeur intelligent:

CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc; 
si (spHTMLDoc != NULL) 
{ 
//Enfin, supprimer les images. 
RemoveImages(spHTMLDoc); 
} 

Je serais plutôt de l'écrire de cette façon:

vide RemoveImages(CComPtr<IHTMLDocument2> document2);

Est-il mieux?

+1 pour l'utilisation de <b> dans le code de la section. Ne savais pas que l'on.

OriginalL'auteur Mariusz Pawelski | 2010-11-26