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

StackOverflow https://stackoverflow.com/questions/4284621

  •  28-09-2019
  •  | 
  •  

Question

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

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

  2.  Dans ce ce lien il est utilisé pour la libération objet navigateur. Où dois-je utiliser? En utilisation « normale » (avec mes propres classes) Je ne suis pas besoin. Dois-je utiliser dans cette situation:
     Je reçois l'objet de document à l'aide m_spWebBrowser-> get_document (& spDispDoc):    
    void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
    {
        // Query for the IWebBrowser2 interface.
        CComQIPtr spTempWebBrowser = pDisp;
    
        // Is this event associated with the top-level browser?
        if (spTempWebBrowser && m_spWebBrowser &&
            m_spWebBrowser.IsEqualObject(spTempWebBrowser))
        {
            // Get the current document object from browser...
            CComPtr spDispDoc;
            hr = m_spWebBrowser->get_Document(&spDispDoc);
            if (SUCCEEDED(hr))
            {
                // ...and query for an HTML document.
                CComQIPtr htmlDoc2 = spDispDoc;
                m_spHTMLDocument = spHTMLDoc;
            }
        }
    
    }
    
     Dois-je libérer spHTMLDocument en fonction SetSite comme je le fais avec m_spWebBrowser (comme dans le lien mentionné plus haut)?
  3. Puis-je retourner CComPtr d'une fonction en toute sécurité?
  4. Je veux dire comme ceci:
    CComPtr getObjects(CComQIPtr<IHTMLDocument3> htmlDoc3)
    {
     CComPtr objects;
     hr = htmlDoc3->getElementsByTagName(CComBSTR(L"object"), &objects);
     if(SUCCEEDED(hr) && objects != NULL)
     {
      return objects;
     }
     return NULL;
    }
    
  5. Devrais-je jamais utiliser un pointeur normal?
  6. Dans RemoveImages lien précédent fonction privée est déclarée ainsi:
    void RemoveImages(IHTMLDocument2 *pDocument); 
    mais appelée avec pointeur intelligent:
    CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
    if (spHTMLDoc != NULL)
    {
     // Finally, remove the images.
     RemoveImages(spHTMLDoc);
    }
    
    Je préférerais écrire de cette façon:
    void RemoveImages(CComPtr<IHTMLDocument2> document2);
    Est-ce mieux?
Était-ce utile?

La solution

Pour la première question. CComPtr::Release() a le même effet que l'attribution d'un pointeur null à l'objet. Vous pouvez appeler Release() (ou attribuer un pointeur NULL) si, pour quelque raison que ce que vous voulez libérer l'objet avant le pointeur est hors de portée. Par exemple:

CComPtr<ISomeInterface> pointer;
HRESULT hr = firstProvider->GetObject( &pointer );
if( SUCCEEDED( hr ) ) {
   //use the object
   pointer.Release();
}
HRESULT hr = secondProvider->GetObject( &pointer );
if( SUCCEEDED( hr ) ) {
   //use the object
}

Vous voyez, quand GetObject() obtient le pointeur, il remplace la valeur déjà stockée dans CComPtr. Si CComPtr stocke un pointeur non nul, il sera tout simplement écrasé (copie peu profonde) et l'objet pointé par le pointeur d'origine seront divulgués. Vous n'avez pas besoin Release() avant le premier GetObject() - le pointeur est nulle à ce moment-là. Et vous n'avez pas besoin, soit après la deuxième GetObject() -. L'objet sera relased une fois que le pointeur est hors de portée

Pour la deuxième question . Oui, vous pouvez retourner CComPtr mais seulement si l'appelant accepte également en CComPtr. Le code suivant:

ISomeInterface* pointer = YourFunctionReturningCComPtr();

ne prendra pas la propriété de l'objet, de sorte que l'objet sera libéré et pointer deviendra ballants. C'est un comportement non défini.

Pour la troisième question CComPtr est pour la propriété. En général, il n'y a pas de point en passant CComPtr comme paramètre « dans » sauf si vous savez pourquoi vous faites exactement cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top