IE的DLL绑定(BHO)
2008-02-23 05:29:19来源:互联网 阅读 ()
我查阅了一些资料,但写关于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插件——定制您的浏览器
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash