Events ATL C++;BHO

Events ATL C++;BHO,events,atl,bho,postmessage,Events,Atl,Bho,Postmessage,在一个网页上,我有一个带有JavaScript post消息的按钮。在我的BHO IE插件中,我需要一个用于此消息事件的事件侦听器。你知道怎么做吗?我的OnDocumentComplete如下所示。你能不能再给我们一些提示,我们可以在哪里编写代码来处理这个事件。我想从此消息处理程序进行REST API调用 TestScript.h: //TestScript.h:CTestScript的声明 #布拉格语一次 #包括“resource.h”//main符号 #包括“TestBHO_i.h” #包含

在一个网页上,我有一个带有JavaScript post消息的按钮。在我的BHO IE插件中,我需要一个用于此消息事件的事件侦听器。你知道怎么做吗?我的
OnDocumentComplete
如下所示。你能不能再给我们一些提示,我们可以在哪里编写代码来处理这个事件。我想从此消息处理程序进行REST API调用

TestScript.h:

//TestScript.h:CTestScript的声明
#布拉格语一次
#包括“resource.h”//main符号
#包括“TestBHO_i.h”
#包含//DOM接口
#如果已定义(_WIN32_WCE)&&!已定义(\u CE\u DCOM)&!已定义(\u CE\u允许\u单线程\u对象\u在\u MTA中)
#错误“Windows CE平台不正确支持单线程COM对象,例如不包括完全DCOM支持的Windows Mobile平台。在MTA中定义\u CE\u允许\u单线程\u对象\u强制ATL支持创建单线程COM对象,并允许使用其单线程COM对象实现。rgs文件中的线程模型已设置为“自由”,因为这是非DCOM Windows CE平台支持的唯一线程模型。”
#恩迪夫
//CTestScript
类ATL_NO_VTABLE CTestScript:
公共CComObjectRootEx,
公共课程,
具有SiteImpl的公共对象,
公共场所,
公共IDispenTempl,
//公共IPersistPropertyBaginpl,
公共IObjectSafetyImpl
{
公众:
CTestScript()
{
}
声明\u注册表\u资源ID(IDR\u测试脚本)
声明不可聚合(CTestScript)
开始COM映射(CTestScript)
COM_接口_条目(ITestScript)
COM_接口_条目(IDispatch)
COM_接口_条目(IObjectWithSite)
END_COM_MAP()
声明\u保护\u最终\u构造()
HRESULT FinalConstruct()
{
返回S_OK;
}
void FinalRelease()
{
}
公众:
开始\u接收器\u映射(CTestScript)
接收项(1,DIID\U DWebBrowserEvents 2,DISPID\u DOCUMENTCOMPLETE,OnDocumentComplete)
//SINK\u ENTRY\u EX(1,DIID\u DWebBrowserEvents2,DISPID\u NavigateComplete 2,OnNavigationComplete)
END_SINK_MAP()
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch*pDisp,变体*pvarURL);
//void STDMETHODCALLTYPE OnNavigationComplete(IDispatch*pDisp,变体*pvarURL);
标准方法(设置位置)(IUnknown*朋克位置);
HRESULT STDMETHODCALLTYPE剂量测定法(){
::MessageBox(空,L“你好”,L“世界”,MB_OK);
返回S_OK;
}
公众:
//私人:
//安装方法();
私人:
作废启用OpenOnDeskTopButton(IHTMLDocument2*pDocument);
私人:
作废AddPostMessage(IHTMLDocument2*pDocument);
私人:
首席检察官m_spWebBrowser;
布尔穆法德维塞德;
};
对象输入自动(uuuidof(TestScript),CTestScript)
TestScript.cpp:

//TestScript.cpp:CTestScript的实现
#包括“stdafx.h”
#包括“TestScript.h”
//CTestScript
无效调试(LPWSTR消息)
{
::MessageBox(NULL,msg,L“Debug”,MB_OK);;
}
STDMETHODIMP CTestScript::SetSite(IUnknown*pUnkSite)
{
if(朋克站点!=NULL)
{
//缓存指向IWebBrowser2的指针。
HRESULT hr=pUnkSite->QueryInterface(IID_IWebBrowser2,(void**)和m_spWebBrowser);
如果(成功(hr))
{
//注册以接收来自DWebBrowserEvents2的事件。
hr=分散式台钳(m_spWebBrowser);
如果(成功(hr))
{
m_fAdvised=真;
}
}
}
其他的
{
//取消注册事件接收器。
如果(m_fAdvised)
{
Dispateventunadvise(m_spWebBrowser);
m_fAdvised=假;
}
//在此处释放缓存指针和其他资源。
m_spWebBrowser.Release();
}
//调用基类实现。
返回IObjectWithSiteImpl::SetSite(pUnkSite);
}
void STDMETHODCALLTYPE CTestScript::OnDocumentComplete(IDispatch*pDisp,VARIANT*pvarURL)
{
HRESULT hr=S_正常;
//查询IWebBrowser2接口。
CComQIPtr spTempWebBrowser=pDisp;
//首席执行官斯皮文特目标;
//此事件是否与顶级浏览器关联?
如果(spTempWebBrowser和&m_spWebBrowser&&
m_spWebBrowser.IsEqualObject(spTempWebBrowser))
{
//从浏览器中获取当前文档对象。。。
CComPtr spDispDoc;
hr=m_spWebBrowser->get_Document(&spDispDoc);
如果(成功(hr))
{
//…并查询HTML文档。
CCOMKIPTR spHTMLDoc=spDispDoc;
如果(spHTMLDoc!=NULL)
{
启用OpenOnDeskTopButton(spHTMLDoc);
AddPostMessage(spHTMLDoc);
}
}
}
}
void CTestScript::EnableOpenOnDesktopButton(IHTMLDocument2*pDocument)
{
CComPtr bodypt;
CComPtr html;
pDocument->get_body(&bodypt);
bodypt->get_parentElement(&html);
//TODO:将旧类和新类合并并应用于HT
BSTR className=L“我的浏览器扩展”;
html->put_className(className);
}
void CTestScript::AddPostMessage(IHTMLDocument2*pDocument)
{
HRESULT hr=S_正常;
CComPtr\u spWindow;
hr=pDocument->get_parentWindow(重新解释强制转换(&&u spWindow));
如果(成功(hr)和&&U spWindow)
{
首席执行官斯皮文特目标;
hr=\u spWindow->QueryInterface(IID\u IEventTarget,reinterpret\u cast(&spieventarget));
如果(成功(hr)和&spIEventTarget)
{
_pIEUIEventListener=new CIEUIEventListener();//此类派生自IDispatch
hr=spIEventTarget->addEventListener(_bstr_t(“消息”),_pieuiventlistener,VARIANT_TRUE);
如果(成功(hr))
{
调试(此处简称“调试”);
}
}
}
}
IEUIEventListener.h:

#pragma一次
类别CIEUIEventListener:公共IDispatchEx
{
公众:
CIEUIEventListener(无效);
~CIEUIEventListener(无效);
HRESULT STDMETHODCALLTYPE调用(
DISPID DISPID成员,
雷菲德·里德,
LCID LCID,
单词wFlags,
数字化信息系统
MIDL_INTERFACE("305104b9-98b5-11cf-bb82-00aa00bdce0b")
IEventTarget : public IDispatch
{
public:
    virtual /* [id] */ HRESULT STDMETHODCALLTYPE addEventListener( 
        /* [in] */ __RPC__in BSTR type,
        /* [in] */ __RPC__in_opt IDispatch *listener,
        /* [in] */ VARIANT_BOOL useCapture) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE removeEventListener( 
        /* [in] */ __RPC__in BSTR type,
        /* [in] */ __RPC__in_opt IDispatch *listener,
        /* [in] */ VARIANT_BOOL useCapture) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE dispatchEvent( 
        /* [in] */ __RPC__in_opt IDOMEvent *evt,
        /* [out][retval] */ __RPC__out VARIANT_BOOL *pfResult) = 0;

};

MIDL_INTERFACE("305104ba-98b5-11cf-bb82-00aa00bdce0b")
IDOMEvent : public IDispatch
{
public:
    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_bubbles( 
        /* [out][retval] */ __RPC__out VARIANT_BOOL *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_cancelable( 
        /* [out][retval] */ __RPC__out VARIANT_BOOL *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_currentTarget( 
        /* [out][retval] */ __RPC__deref_out_opt IEventTarget **p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_defaultPrevented( 
        /* [out][retval] */ __RPC__out VARIANT_BOOL *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_eventPhase( 
        /* [out][retval] */ __RPC__out USHORT *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_target( 
        /* [out][retval] */ __RPC__deref_out_opt IEventTarget **p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_timeStamp( 
        /* [out][retval] */ __RPC__out ULONGLONG *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_type( 
        /* [out][retval] */ __RPC__deref_out_opt BSTR *p) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE initEvent( 
        /* [in] */ __RPC__in BSTR eventType,
        /* [in] */ VARIANT_BOOL canBubble,
        /* [in] */ VARIANT_BOOL cancelable) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE preventDefault( void) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE stopPropagation( void) = 0;

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE stopImmediatePropagation( void) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_isTrusted( 
        /* [out][retval] */ __RPC__out VARIANT_BOOL *p) = 0;

    virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_cancelBubble( 
        /* [in] */ VARIANT_BOOL v) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_cancelBubble( 
        /* [out][retval] */ __RPC__out VARIANT_BOOL *p) = 0;

    virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_srcElement( 
        /* [out][retval] */ __RPC__deref_out_opt IHTMLElement **p) = 0;

};
// Usage:
//
// CComPtr<CEventSink> eventSink;
// CEventSink::Create(pTestScript, &eventSink); // pass eventSink where IDispatch* is expected
//

class CEventSink: 
    public CComObjectRoot,
    public IDispatch
{
protected:
    CTestScript* m_pParent;

    CEventSink() { m_pParent = NULL; }

public:
    BEGIN_COM_MAP(CEventSink)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()

    // create and initialize
    static HRESULT Create(CTestScript* pParent, CEventSink** pp)
    {
        CComObject<CEventSink>* pThis = NULL;
        CComObject<CEventSink>::CreateInstance(&pThis);
        if (!pThis) 
            return E_OUTOFMEMORY;

        pThis->m_pParent = pParent;

        (*pp = pThis)->AddRef();
        return S_OK;
    }

    // IDispatch
    STDMETHODIMP GetTypeInfoCount(UINT* pctinfo)
    {
        return E_NOTIMPL; 
    }

    STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
    {
        return E_NOTIMPL; 
    }

    STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid)
    {
        return DISP_E_UNKNOWNNAME;
    }

    STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr)
    {
        if ( dispidMember == DISPID_VALUE )
        {
            // handle the event
            // for example, call some method on m_pParent
        }
        return DISP_E_MEMBERNOTFOUND;
    }
};