繁体   English   中英

我必须使用-> Release()吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM