网页中响应ActiveX控件自定义事件

这几天在开发过程中遇到一个问题,即在网页中无法响应ActiveX控件自定义事件。经查资料后,明白ActiveX控件的事件如果要通过JavaScript等脚本语言响应,必须实现IProvideClassInfo或者IProvideClassInfo2接口。因为脚本语言必须通过这个接口获得控件的接口信息。

用MFC ActiveX Control Wizard生成的项目,其接口的实现是通过嵌套类完成,要实现IProvideClassInfo接口我们可以按下列步骤进行:
1. 在COleControl的继承类.h文件中加入代码:
BEGIN_INTERFACE_PART(ProvideClassInfo, IProvideClassInfo)
STDMETHOD_(HRESULT, GetClassInfo) (
/*[out] */ITypeInfo** ppTI
);
END_INTERFACE_PART(ProvideClassInfo);

2. 在COleControl的继承类.cpp文件中加入代码,并实现接口:
BEGIN_INTERFACE_MAP( CMetaKM_FC_BCtrl, COleControl )
INTERFACE_PART(CMetaKM_FC_BCtrl, IID_IProvideClassInfo, ProvideClassInfo)
END_INTERFACE_MAP()

ULONG FAR EXPORT CMetaKM_FC_BCtrl::XProvideClassInfo::AddRef()
{
METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
return pThis->ExternalAddRef();
}

ULONG FAR EXPORT CMetaKM_FC_BCtrl::XProvideClassInfo::Release()
{
METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
return pThis->ExternalRelease();
}

HRESULT STDMETHODCALLTYPE
CMetaKM_FC_BCtrl::XProvideClassInfo::QueryInterface (
REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

HRESULT STDMETHODCALLTYPE
CMetaKM_FC_BCtrl::XProvideClassInfo::GetClassInfo (
/* [out] */ITypeInfo** ppTI
)
{
METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)

HRESULT hr;
LPTYPELIB typeLib;
CString str;
hr = pThis->GetTypeLib( LANG_USER_DEFAULT, &typeLib );
str.Format( _T("%x"), hr );
AfxMessageBox( str );

hr = typeLib->GetTypeInfo( 0, ppTI );
str.Format( _T("%x"), hr );
AfxMessageBox( str );
return hr;
}

如果是用ATL COM Wizard生成的工程,那么在New ATL Object时可以选择Full Control,该选项默认已经实现IProvideClassInfo2接口。如果选择其他轻量级ActiveX对象,那么实现IProvideClassInfo2接口也相当容易。
因为ATL COM Wizard生成的工程,对于接口的实现时通过多重继承完成的,只有在接口定义中加入继承IProvideClassInfo2即可。
1. 在接口定义中加入:
public IProvideClassInfo2Impl<&CLSID_MetaKM_FC_B, &DIID__IMetaKM_FC_BEvents, &LIBID_METAKM_FC_CTRLLib>
2.在BEGIN_COM_MAP(CMetaKM_FC_B)与END_COM_MAP()对中加入COM_INTERFACE_ENTRY(IProvideClassInfo)和COM_INTERFACE_ENTRY(IProvideClassInfo2)

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=26596317),在CSDN作同步更新。如需转载,请保留本段文字,并发邮件通知:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/karman/archive/2006/04/09/656088.aspx

时间: 2024-10-23 05:59:59

网页中响应ActiveX控件自定义事件的相关文章

Microsoft ActiveX Control Pad 在HTML网页中插入ActiveX控件 .

开发工具:1. Visual Studio 2005,用于ActiveX组件的开发2. Microsoft ActiveX Control Pad,用于生成包含ActiveX Control的HTML网页. 步骤:1. 通过Visual Studio 2005新建一个MFC ActiveX Control工程,编译之后在debug/release目录下可以找到一个XXXX.ocx文件.具体步骤可以参考MSDN. 2. 在ActiveX Control Pad选择菜单File -> New HTM

MFC中动态创建控件以及事件响应实现方法_C 语言

本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()

如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性 .

如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性   此文章的信息应用于: Microsoft Internet Explorer (编程) 版本4.0, 4.01, 4.01 SP1, 4.01 SP2, 5, 5.01, 5.5,6.0 概要 CSDN文档中心文章 用 MSHTML 的一点经验 111222(原作) 说明了如何访问在HTML文档对象模型中的网页的元素.内容.但是,有时候开发者实际上需要访问的是网页中ActiveX控件的属性.方法和事件.例如,你在网页载入之

ctivex-MFC中开发ActiveX控件问题

问题描述 MFC中开发ActiveX控件问题 在VS2010中使用VC++的MFC建立ActiveX控件时,控件默认在整个控件区域画了一个椭圆.问:如何改变控件的大小,即使控件有一个自定义的默认大小?求教... 解决方案 MoveWindow等来控制控件大小. 解决方案二: 你可以定义一个属性表示椭圆所在的区域的大小.构造函数给它们默认值画图的代码据此绘出椭圆. 解决方案三: 这个,改变初始值就可以了啊 解决方案四: onwindowsize消息里面做点手脚. 解决方案五: 大小一般是在创建控件

javascript-js定义的类中定义某控件挂事件,事件内部如何引用到定义的类

问题描述 js定义的类中定义某控件挂事件,事件内部如何引用到定义的类 function AA(obj){ this.a1="12"; this.a2="13"; obj.onclick=function(){ alert(this);//这里的this,其实是obj吧,而不是由AA定义出的对象 //要怎么引用到AA定义出的对象,如cc1()里的this } function cc1(){ alert(this);//这里的this是AA定义出的对象吧, } } 解决

如何在IE浏览器中屏蔽ActiveX控件

  ActiveX控件广泛应用于Internet,它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向你提供不需要的内容.在某些情况下,这些程序可被用来以你不允许的方式从计算机收集信息.破坏计算机上的数据.在未经同意的情况下在计算机上安装软件或者允许他人远程控制计算机.因此,有时要屏蔽掉这些对计算机安全构成威胁的ActiveX控件. 第1步:打开深度xp系统下载的IE浏览器窗口,在菜单栏单击"工具"-"Internet选项"命令,然后在打

VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

设置VS2008和IE8 调试ATL控件   VS2008设置篇:     设置VS2008 通过IE8 调试ATL的ActiveX控件的步骤如下: (1)       设置项目属性 通过菜单项 "项目->你的项目属性"如下图: (2)       在弹出的属性页对话框中选中"配置属性->调试",在右边填入下列参数: 命令         :C:\Program Files\Internet Explorer\iexplore.exe(你的IE8执行文件

我想记录下C#中的WebBrowser控件所有事件如何做

问题描述 我想用C#中的WebBrowser控件做一个简易的浏览器,并编写一段代码记录下浏览器向系统发送的消息和系统向浏览器发送的消息,保存的一个文本文档中.目的是分析一下我在网页中的一些操作都触发了哪些事件,好模拟一下.如果可以的话,最好给我来段代码. 解决方案 解决方案二:百度一下,找找控件的相关事件,看看有没有什么能够触发的解决方案三:这个我找了,没发现适用的解决方案四:用fiddler调试

如何在C++ Builder 2007中添加ActiveX控件

BCB2007 的发布是一件令人振奋的事情,它强大的功能和良好的稳定性让我决定从BCB6.0 转向2007. BCB2007 的变化还是比较大的,它不能像6.0那样方便地安装我们的ActiveX 控件,甚至有些网友说它根本不能安装ActiveX 控件,这样导致了广大网友对BCB2007的不满.BCB2007真的无法安装我们的ActiveX 控件吗? 答案是:可以安装. 详细的安装方案看下面的描述吧,有2个方案. [方案一] 条件:安装有BCB6.0 和 BCB2007 步骤: (1) 这里我们用