DWebBrowserEvents2がATLのマクロを使用して処理されたときHTMLElementEvents2ハンドル
-
12-09-2019 - |
質問
私はVS2008、C ++を使用して、ブラウザヘルパーオブジェクトを作成しています。私のクラスは多くの人の間ではIDispEventImplから派生されています。
class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}
上記のコードから明らかなように、私のDWebBrowserEvents2は、ATLのマクロを使用して処理されます。今、私はHTMLElementEvents2を処理することについては(クリック、スクロールバーなどを検出するため)、I IConnectionPointContainerのQueryInterface()IHTMLElement、のQueryInterface(のためのIHTMLDocument2オブジェクト)それとはIConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)を呼び出します。 (HTMLElementEvents2の取り扱いに関する MSDNの記事を参照してください)。問題は、私は私のクラスでのIDispatch ::呼び出しを上書きしたときに、(ATLマクロを使用して作成)DWebBrowserEvents2ハンドルが失敗し、です。それだけでHTMLElementEvents2?
扱うように呼び出す呼び出しを上書きせずにHTMLElementEvents2を扱う、または実装する方法はあります
おかげで、すべてのヘルプは大歓迎されます。
解決
起動をオーバーライドしたり、IConnectionPointContainerを取得するための本当の必要はありません。
:これは、別のはIDispEventImplを実装する、ATLプロジェクトですので、public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>
トリックを行います。次に、エントリをシンクとしてます:
SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)
OnDocumentCompleteで、のIWebBrowser2 :: get_Document、IHTMLDocument2 :: get_bodyを呼び出し、その後、イベントの受信を開始するDispEventAdviseを呼び出します。
私はDIID_HTMLTextContainerEvents2代わりのDIID_HTMLElementEventsを使用しましたことに注意してください。これは、ボディオブジェクトがHTMLElementEvents2をサポートしていないためだ、と私の目的のために(スクロール処理するために)これはうまく動作します!