分享
 
 
 

IE编程---DLL绑定

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

IE编程---DLL绑定

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

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

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

IE的启动过程:

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

HKEY_LOCALL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser 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;

hr = m_spWebBrowser2->get_Document(&spDisp);

if (SUCCEEDED(hr))

{

CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML;

spHTML = spDisp;

// if (spHTML)

// RemoveDocument(spHTML);

}

break;

case DISPID_NAVIGATECOMPLETE2:

//

/* if (m_spWebBrowser2){

_bstr_t bsAddress=m_spWebBrowser2->GetLocationURL();

LPCTSTR str1,str2;

str1="SolarSafe.htm";

str2=(LPCTSTR)bsAddress;

if (strstr(str2,str1)!=NULL)

{

ShellExecute((HWND)m_spWebBrowser2->HWND,"open","C:\\solarsafe.htm",NULL,NULL,SW_SHOWNORMAL);

}

*/

break;

// [0]: New status bar text - VT_BSTR

//

/*

case DISPID_STATUSTEXTCHANGE:

break;

*/

// [0]: Maximum progress - VT_I4

// [1]: Amount of total progress - VT_I4

//

/*

case DISPID_PROGRESSCHANGE:

break;

*/

// [0]: Document URL - VT_BYREF|VT_VARIANT

// [1]: An object that evaluates to the top-level or frame

// WebBrowser object corresponding to the event.

case DISPID_DOCUMENTCOMPLETE:

// Temporarily disable keyboard hook

if(m_test)

{//ShellExecute(m_hwndIE,"open","C:\\solarsafe.htm",NULL,NULL,SW_SHOWNORMAL);

MessageBox(m_hwndIE, "AAAA", "A", MB_OK );

// m_spWebBrowser2->Quit();

m_test=FALSE;

}

// Fill in form if necessary

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

// Get the WebBrowser's document object

hr = m_spWebBrowser2->get_Document(&spDisp);

if (SUCCEEDED(hr))

{

CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML;

spHTML = spDisp;

// if (spHTML && DoFillIn(spHTML))

// AddDocument(spHTML);

}

m_bDocComplete = TRUE;

// Temporarily disable keyboard hook

break;

// No parameters

/*

case DISPID_DOWNLOADBEGIN:

break;

*/

// No parameters

/*

case DISPID_DOWNLOADCOMPLETE:

break;

*/

// [0]: Enabled state - VT_BOOL

// [1]: Command identifier - VT_I4

//

/*

case DISPID_COMMANDSTATECHANGE:

break;

*/

// [0]: Address of cancel flag - VT_BYREF|VT_BOOL

//

/*

case DISPID_NEWWINDOW2:

break;

*/

// [0]: Document title - VT_BSTR

// [1]: An object that evaluates to the top-level or frame

// WebBrowser object corresponding to the event.

//

/*

case DISPID_TITLECHANGE:

break;

*/

// [0]: Name of property that changed - VT_BSTR

//

/*

case DISPID_PROPERTYCHANGE:

break;

*/

// [0]: Address of cancel flag - VT_BYREF|VT_BOOL

//

case DISPID_ONQUIT:

// Unregister the keyboard hook previously installed

// for this instance.

ManageConnection(Unadvise);

break;

default:

break;

}

return S_OK;

}

STDMETHODIMP CFiltrateIE::SetSite(IUnknown *pUnkSite)

{

if (pUnkSite != NULL)

{

// Query pUnkSite for the IWebBrowser2 interface.

m_spWebBrowser2 = pUnkSite;

if (m_spWebBrowser2)

{

m_spWebBrowser2->get_HWND((long*) &m_hwndIE);

// We'll need the this pointer later when the keyboard

// hook will be called.

// if (!AddInstance(m_hwndIE, this, GetCurrentThreadId()))

// FormWhizError(IDS_ERROR_TOOMUCHWINDOWS, errError);

// Connect to the browser in order to handle events.

if (!ManageConnection(Advise))

MessageBox(m_hwndIE, "AAAA", "A", MB_OK );

// FormWhizError(IDS_ERROR_SINKINGFAILED, errError);

}

}

return S_OK;

}

找到.rgs文件,加入

HKLM

{

SOFTWARE

{

Microsoft

{

Windows

{

CurrentVersion

{

Explorer

{

'Browser Helper Objects'

{

ForceRemove {B5D4581D-ED6A-4905-A267-25BAF7BE79C1} = s 'SafeIE Utility'

}

}

}

}

}

}

}

上边的{B5D4581D-ED6A-4905-A267-25BAF7BE79C1}在这个文件中可以找到,注意,你做的CSLID肯定不一样。

一切OK,想试一下,可以先看一下,本工程代码

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有