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?