Некоторые вопросы об использовании CComPtr (при использовании Release ()? Могу ли я вернуть CComPtr ?,…)

Я пишу надстройку для Internet Explorer (BHO) и использую интеллектуальные указатели CComPtr. Интересно:

  1. Когда мне следует использовать функцию CComPtr.Release ()?

  2. В этой этой ссылке используется для выпуска объект браузера. Где еще мне его использовать? При «нормальном» использовании (с моими собственными классами) мне это не нужно. Стоит ли использовать его в этой ситуации:
    Я получаю объект документа с помощью m_spWebBrowser-> get_Document (& spDispDoc):
    void STDMETHODCALLTYPE CHelloWorldBHO :: OnDocumentComplete (IDispatch * pDisp, VARIANT * pvarURL)
    {
     // Запрос интерфейса IWebBrowser2.
     CComQIPtr spTempWebBrowser = pDisp;
    
     // Связано ли это событие с браузером верхнего уровня?
     если (spTempWebBrowser && m_spWebBrowser &&
     m_spWebBrowser.IsEqualObject (spTempWebBrowser))
     {
     // Получить текущий объект документа из браузера ...
     CComPtr spDispDoc;
      hr = m_spWebBrowser-> get_Document (& spDispDoc); 
     если (УСПЕШНО (час))
     {
     // ... и запросить документ HTML.
     CComQIPtr htmlDoc2 = spDispDoc;
      m_spHTMLDocument = spHTMLDoc; 
     }
     }
    
    }
    
    Следует ли мне выпустить spHTMLDocument в функции SetSite, как я делаю с m_spWebBrowser (как в упомянутой ранее ссылке)?
  3. Можно ли безопасно вернуть CComPtr из функции?
  4. Я имею в виду вот так:
    CComPtr getObjects (CComQIPtr  htmlDoc3)
    {
     Объекты CComPtr;
     hr = htmlDoc3-> getElementsByTagName (CComBSTR (L "объект"), & объекты);
     если (УСПЕШНО (час) && объекты! = NULL)
     {
     возвращать объекты;
     }
     return NULL;
    }
    
  5. Следует ли мне никогда не использовать обычный указатель?
  6. В предыдущей ссылке приватная функция RemoveImages объявляется так:
     void RemoveImages (IHTMLDocument2 * pDocument); 
    но вызывается умным указателем:
    CComQIPtr  spHTMLDoc = spDispDoc;
    если (spHTMLDoc! = NULL)
    {
     // Наконец, удалим изображения.
     RemoveImages (spHTMLDoc);
    }
    
    Я бы лучше написал это так:
     void RemoveImages (CComPtr  document2); 
    Это лучше?

11
задан Mariusz Pawelski 26 November 2010 в 13:11
поделиться