3

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 イベントを取得し、IHTMLWindow2 および IHTMLLocation への非 NULL wnd ポインターを取得しますが、pLoc ポインターを使用して、href などを取得するなどの操作を試みると、「アクセス拒否エラー」エラーが発生します。 . また、doc.documentElement.outerHTMLをチェックすると、

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

これは対象ページのコンテンツではありません。

同時に IE10 では、このコードは期待どおりに機能します。

私が間違っている場所と、DocumentComplete で無効なオブジェクトを取得する理由を教えてください。

4

0 に答える 0