[英]Do I have to use ->Release()?
我正在使用c ++上的Web浏览器主机,我设法接收事件,并且在DISPID_DOCUMENTCOMPLETE上运行此void:
void DocumentComplete(LPDISPATCH pDisp, VARIANT *url)
{
READYSTATE rState;
iBrowser->get_ReadyState(&rState);
if(rState == READYSTATE_COMPLETE)
{
HRESULT hr;
IDispatch *pHtmlDoc = NULL;
IHTMLDocument2 *pDocument = NULL;
IHTMLElement *pBody = NULL;
IHTMLElement *lpParentElm = NULL;
BSTR bstrHTMLText;
hr = iBrowser->get_Document(&pHtmlDoc);
hr = pHtmlDoc->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
if( (FAILED(hr)) || !pDocument)
{
MessageBox(NULL, "QueryInterface failed", "WebBrowser", MB_OK);
}
hr = pDocument->get_body( &pBody );
if( (!SUCCEEDED(hr)) || !pBody)
{
MessageBox(NULL, "get_body failed", "WebBrowser", MB_OK);
}
pBody->get_parentElement(&lpParentElm);
lpParentElm->get_outerHTML(&bstrHTMLText);
_bstr_t bstr_t(bstrHTMLText);
std::string sTemp(bstr_t);
MessageBox(NULL, sTemp.c_str(), "WebBrowser", MB_OK);
}
}
我对C ++不太了解,我是通过观看google中的其他代码来构建此代码的。 现在我知道我必须使用-> Release,但是我必须使用所有这些吗?:
pHtmlDoc->Release();
pDocument->Release();
pBody->Release();
lpParentElm->Release();
iBrowser->Release();
因为在我用来构建代码的示例中,它仅将其用于IHTMLElement。
是的,您必须在这些指针上调用Release()
,否则对象将泄漏。 BSTR
也是如此。
如果您为此使用智能指针,则情况会好得多ATL::CComPtr
/ ATL::CComBSTR
或_com_ptr_t
/ _bstr_t
。
您应该将这些对象包装到CComPtr
或其变体之一中。 那将为您处理发行。 它与RAII的概念一致。
是的你是。 但是不在iBrowser上,您没有在此代码内获取该指针。
请注意,您的错误检查还不够,当get_Document()失败时,您的代码将被炸毁。 与get_parentElement()相同。 并且在消息框被关闭之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.