Как дождаться завершения IWebBrowser2::ExecWB() при печати из элемента управления WebBrowser?

#c #internet-explorer #mfc #com #webbrowser-control

#c #internet-explorer #mfc #com #webbrowser-control

Вопрос:

Я использую элемент управления WebBrowser в моем окне MFC на основе CDialog. Окно разрешает печать, используя код, подобный этому:

 CComPtr<IWebBrowser2> pWebBrowser = this->GetIWebBrowser2();
if(pWebBrowser)
{
    HRESULT hr;
    COleVariant varNull;

    if(SUCCEEDED(hr = pWebBrowser->ExecWB(
        bDoPreview ? OLECMDID_PRINTPREVIEW : OLECMDID_PRINT, 
        OLECMDEXECOPT_PROMPTUSER, varNull, varNull)))
    {
        //All good
        bRes = TRUE;
    }
}

IWebBrowser2* GetIWebBrowser2()
{
    IWebBrowser2* pBrowser = NULL;
    LPUNKNOWN unknown = m_browser.GetControlUnknown();
    if(unknown)
    {
        unknown->QueryInterface(IID_IWebBrowser2,(void **)amp;pBrowser);

        if(unknown)
        {
            unknown->Release();
        }
    }

    return pBrowser;
}
  

Это работает, за исключением того, что, если документ достаточно большой, pWebBrowser->ExecWB() кажется, что он сразу возвращается, и вся печать выполняется асинхронно. Итак, в этом случае, если пользователь закрывает мое окно (в котором находится этот элемент управления WebBrowser), печать прерывается на полпути.

Таким образом, мой вопрос, как мне дождаться завершения печати, прежде чем я смогу разрешить закрытие окна хоста?

Комментарии:

1. Хорошо, кому интересно, я нашел решение. Вот старый проект , который покажет это в действии. По сути, вам нужно перехватить DISPID_PRINTTEMPLATETEARDOWN событие (состоящее из 226 знаков после запятой) в вашем BEGIN_EVENTSINK_MAP , которое будет передано WebBrowser элементом управления, когда задание печати будет завершено или отменено.

2. Почему бы вам не конкретизировать ответ?