IE的DLL绑定(BHO)

2008-02-23 05:29:19来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

顾剑辉(http://solarsoft.126.com)



我查阅了一些资料,但写关于IE的DLL绑定的文章并不多,而且,写得不是很清楚。为此,我想介绍一下,这个方法:

基础知识:VC COM,(ALT方法来做)

IE的启动过程:

当IE的实例启动的时候,他会在注册表中寻找一个CLSID,具体位置在

HKEY_LOCALL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects

当这里存在一CLSID时,IE会建立一个对象的实例。比如:{B5D4581D-ED6A-4905-A267-25BAF7BE79C1}假如这个看不懂,您能够去找一下COM研发的书。

研发实例:

VC建立工程,ALT COM AppWizard 注意是DLL.

建立一个新的类,一定要是ALT

在菜单,Insert>New ALT Object:Simple Object

修改并实现方法

// FiltrateIE.h : Declaration of the CFiltrateIE



#ifndef __FILTRATEIE_H_

#define __FILTRATEIE_H_

#include "resource.h" // main symbols

#include <ExDisp.h> //这里必须加上这两个头文档

#include <msHtml.h>



#define MAX_DOCUMENTS 50

/////////////////////////////////////////////////////////////////////////////

// CFiltrateIE

class ATL_NO_VTABLE CFiltrateIE :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CFiltrateIE, &CLSID_FiltrateIE>,

public IObjectWithSiteImpl<CFiltrateIE>,//加入这个,以继承该接口

public IDispatchImpl<IFiltrateIE, &IID_IFiltrateIE, &LIBID_SAFEIELib>

{

public:

CFiltrateIE()

{

}



DECLARE_REGISTRY_RESOURCEID(IDR_FILTRATEIE)

DECLARE_NOT_AGGREGATABLE(CFiltrateIE)

DECLARE_PROTECT_FINAL_CONSTRUCT()



BEGIN_COM_MAP(CFiltrateIE)

COM_INTERFACE_ENTRY(IFiltrateIE)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IObjectWithSite)//加入

END_COM_MAP()



// IFiltrateIE

public

//下面两个方法必须实现

STDMETHOD(SetSite)(IUnknown *pUnkSite);

STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,

DISPPARAMS * pdispparams, VARIANT * pvarResult,

EXCEPINFO * pexcepinfo, UINT * puArgErr);

private:

//下面一个方法必须实现

enum ConnectType {Advise,Unadvise};

BOOL ManageConnection(enum ConnectType action);

CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;

HWND m_hwndIE;

DWORD m_dwCookie;

BOOL m_bDocComplete;

BOOL m_test;

};



#endif //__FILTRATEIE_H_

// FiltrateIE.cpp : Implementation of CFiltrateIE

#include "stdafx.h"

#include "SafeIE.h"

#include "FiltrateIE.h"



#include <tchar.h>

#include <ExDisp.h>

#include <ExDispID.h>

#include <comdef.h>

#include <Commctrl.h>

#include <strstrea.h>

/////////////////////////////////////////////////////////////////////////////

// CFiltrateIE

BOOL CFiltrateIE::ManageConnection(enum ConnectType action)

{

if (!m_spWebBrowser2)

return S_OK;



HRESULT hr;



CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> spCPContainer(m_spWebBrowser2);



if (spCPContainer != NULL)

{

CComPtr<IConnectionPoint> spConnectionPoint;



hr = spCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spConnectionPoint);

if (SUCCEEDED(hr))

{

if (action == Advise)

// Advise the client site that we want to sink events

hr = spConnectionPoint->Advise((IDispatch*)this, &m_dwCookie);

else

// Remove us from the list of active sinks

hr = spConnectionPoint->Unadvise(m_dwCookie);

}

}



return (SUCCEEDED(hr));

}



STDMETHODIMP CFiltrateIE::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,

DISPPARAMS* pDispParams, VARIANT* pvarResult,

EXCEPINFO* pExcepInfo, UINT* puArgErr)

{

m_test=TRUE;

if (!pDispParams)

return E_INVALIDARG;



CComPtr<IDispatch> spDisp;

HRESULT hr;



switch (dispidMember)

{

case DISPID_BEFORENAVIGATE2:



m_bDocComplete = FALSE;

m_spWebBrowser2 = pDispParams->rgvarg[6].pdispVal;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: IE里的探索之添加浏览器栏

下一篇: VC 研发BHO插件——定制您的浏览器