手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

IE的DLL绑定(BHO)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
顾剑辉(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;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!