Должен ли я использовать -> Release ()? - PullRequest
1 голос
/ 04 октября 2010

Я работаю с хостом веб-браузера на c ++, мне удалось обработать событие, и я запускаю этот void на DISPID_DOCUMENTCOMPLETE:

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();

Поскольку в примерах, которые я использовал для создания своего кода, он использовал его только для элементов IHTMLE.

Ответы [ 3 ]

4 голосов
/ 04 октября 2010

Да, вам нужно вызвать Release() для этих указателей, иначе объекты будут вытекать.То же самое касается BSTR с.

. Вам будет намного лучше, если вы будете использовать для этого умные указатели - ATL::CComPtr / ATL::CComBSTR или _com_ptr_t / _bstr_t.

3 голосов
/ 04 октября 2010

Вы должны обернуть эти объекты в CComPtr или один из его вариантов.Это будет обрабатывать релиз для вас.Это соответствует концепции RAII.

1 голос
/ 04 октября 2010

Да, вы делаете.Но не в iBrowser, вы не получили этот указатель внутри этого кода.

Остерегайтесь того, что проверки ошибок недостаточно, ваш код будет бомбить при сбое get_Document ().То же самое для get_parentElement ().И после того, как окно сообщения отклонено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...