Неверное окно в DocumentComplete (DISPID_DOCUMENTCOMPLETE) в IE9 BHO

Я разрабатываю BHO, и у меня есть проблемы с обработкой событий в IE9.
Я справляюсь DocumentComplete (DISPID_DOCUMENTCOMPLETE), тогда я получаю IHTMLWindow2 И его IHTMLLocation для будущих операций.

Код (упрощенный)

Класс BHO использует

public IDispEventImpl<1, CBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>,

Консультирование событий браузеров в SetSite

STDMETHODIMP CBHO::SetSite(IUnknown *punkSite)
{
if(punkSite != NULL)
{
CComQIPtr<IServiceProvider> pServiceProvider = punkSite;
pServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**)&m_pWebBrowser);
IDispEventImpl<1, CBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>::DispEventAdvise(m_pWebBrowser);
}
...
}

Карта раковины

BEGIN_SINK_MAP(CBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE, OnDownloadComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_WINDOWSTATECHANGED, OnWindowStateChanged)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_PROPERTYCHANGE, OnPropertyChange)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, DocumentComplete)
END_SINK_MAP()

Обработчик события DocumentComplete:

void _stdcall CBHO::DocumentComplete( IDispatch *pDisp, VARIANT *URL)
{
CComQIPtr<IWebBrowser2> pBrowser(pDisp);
CComPtr<IDispatch> pDispDoc;
pBrowser->get_Document(&pDispDoc);
CComQIPtr<IHTMLDocument2> pDoc(pDispDoc);;
CComPtr<IHTMLWindow2> wnd;
pDoc->get_parentWindow(&wnd);

CComPtr<IHTMLLocation> pLoc;
HRESULT hr = wnd->get_location(&pLoc);
CComBSTR locHref;
hr=oLoc->get_href(&locHref);  //"Access denied" error here
}

Это работает правильно в большинстве случаев, кроме открытия ссылки в новой вкладке (используя средний щелчок или ссылки с target = «_ blank»).
В этом случае новой вкладки я получаю событие DocumentComplete, затем получаю ненулевой указатель wnd на IHTMLWindow2 и IHTMLLocation, но когда я пытаюсь выполнить любую операцию с указателем pLoc, такую ​​как получение href или чего-либо еще, я получаю ошибку «Ошибка отказа доступа» ,
Также при проверке doc.documentElement.outerHTML я получил

<HTML><HEAD></HEAD>
<BODY>
<P>&nbsp;</P></BODY></HTML>

и это не содержание целевой страницы.

В то же время в IE10 этот код работает как положено.

Кто-нибудь может посоветовать, пожалуйста, где я неправ и почему я получаю недопустимый объект в DocumentComplete?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]