【问题标题】:Do I have to use ->Release()?我必须使用 ->Release() 吗?
【发布时间】:2010-10-04 14:07:59
【问题描述】:

我正在使用 c++ 上的 webbrowser 主机,我设法接收事件并且我在 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(s)。

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ memory-management


    【解决方案1】:

    是的,你必须在这些指针上调用Release(),否则对象会泄漏。 BSTRs 也是如此。

    如果您为此使用智能指针会更好 - ATL::CComPtr/ATL::CComBSTR_com_ptr_t/_bstr_t

    【讨论】:

    • 你不想释放iBrowser,除非这是你要做的最后一件事——iBrowser 不在这个函数的范围内。
    • 我需要包含 atlbase.h 才能使用 CComPtr 对吗?这是否会使我编译的应用程序有一些额外的 dll 依赖或类似的东西?
    • @jarkam:如果你只使用CComPtr,你不会有额外的依赖——类是模板化的,所以你可以将代码静态链接到你的可执行文件中。
    【解决方案2】:

    您应该将这些对象包装到 CComPtr 或其变体之一中。这将为您处理发布。它与 RAII 的概念相吻合。

    【讨论】:

      【解决方案3】:

      是的,你知道。但不是在 iBrowser 上,您没有在这段代码中获取该指针。

      请注意,您的错误检查是不够的,当 get_Document() 失败时,您的代码会爆炸。 get_parentElement() 也一样。并且在消息框被关闭后。

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        相关资源
        最近更新 更多