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:
-
- 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)?
-
- 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; }
-
- 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?
OriginalL'auteur Mariusz Pawelski | 2010-11-26
Vous devez vous connecter pour publier un commentaire.
À la première question.
CComPtr::Release()
a le même effet que l'affectation d'un pointeur null à l'objet. Vous pouvez appelerRelease()
(ou affecter un pointeur null) si, pour quelque raison que ce soit vous souhaitez libérer l'objet avant le pointeur est hors de portée. Par exemple:Vous voyez, quand
GetObject()
obtient le pointeur, il remplace la valeur déjà stockées dansCComPtr
. SiCComPtr
stocke un pointeur non null, il va juste être remplacé (copie) et de l'objet pointé par le pointeur sera coulé. Vous n'avez pas besoinRelease()
avant la premièreGetObject()
- le pointeur est nul à ce point. Et vous n'en avez pas besoin, après la secondeGetObject()
- l'objet sera enregistrée une fois que le pointeur est hors de portée.À la deuxième question. Oui, vous pouvez retourner
CComPtr
mais seulement si l'appelant accepte aussi enCComPtr
. Le code suivant:ne prendra pas la propriété de l'objet, de sorte l'objet sera libéré et
pointer
va devenir bancale. C'est un comportement indéfini.À la troisième question
CComPtr
est pour la propriété. Habituellement, il n'y a aucun point en passantCComPtr
comme un "dans" paramètre, sauf si vous savez exactement pourquoi vous le faites.3.: Puis-je le droit?: Lorsque je passe un CComPTR à une fonction qui accepte CComPtr le compteur de référence est augmentée dans les fonctions de, puis ont diminué après le retour de la fonction. Puis le programme s'exécute normalement et faire ce qui est après l'appel. C'est pourquoi je n'ai pas besoin de la passer comme un CComPtr mais peut-utilisation normale pure pointeur parce que rien ne change. Mais que faire si la fonction est appelée de façon asynchrone et après l'invocation de la fonction vous relâchez le pointeur (par exemple en allant hors de portée)?
Si vous attribuer un autre pointeur = précédemment souligné objet sera libéré - vous pouvez réellement ATL code et de voir comment il fonctionne. T3 - si une fonction est appelée de manière asynchrone, il faut stocker un
CComPtr
quelque part la tenue de l'objet actif pendant au moins la durée de cette fonction, il peut être le paramètre de la fonction, ou une autre variable.OriginalL'auteur sharptooth