I writing add-on for Internet Explorer(BHO) and I'm using CComPtr smart pointers. I wonder:
- When should I use CComPtr.Release() function?
- Can I return CComPtr from a function safely? I mean like this:
- Should I never use normal pointer? In previous link RemoveImages private function is declared this way:
In this this link it's used to release browser object. Where else should I use it? In 'normal' use (with my own classes) I don't need it. Should I use it in this situation:
I get document object using 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;
}
}
}
Should I release spHTMLDocument in SetSite function like I do with m_spWebBrowser (like in link mentioned before)?
CComPtr getObjects(CComQIPtr<IHTMLDocument3> htmlDoc3)
{
CComPtr objects;
hr = htmlDoc3->getElementsByTagName(CComBSTR(L"object"), &objects);
if(SUCCEEDED(hr) && objects != NULL)
{
return objects;
}
return NULL;
}
void RemoveImages(IHTMLDocument2 *pDocument);but invoked with smart pointer:
CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
if (spHTMLDoc != NULL)
{
// Finally, remove the images.
RemoveImages(spHTMLDoc);
}
I would rather write it this way:
void RemoveImages(CComPtr<IHTMLDocument2> document2);Is it better?