网页脚本中无法响应ATL事件的解决办法
2010-07-15 18:41
267 查看
网页脚本中无法响应ATL事件的解决办法
提示:纯技术文章,我花了将近两天的时间才解决,发出来希望能为遇到此类问题的人解惑,转载请注明出处(asnowwolf.blog.hexun.com)
学VC没多久,遇到一个问题:自己写的ATL组件触发了一个事件,却无法被脚本响应。于是开始着手解决这个问题,步骤如下:
1.先写了一个测试页面,以便简化问题,防止其他因素的干扰
2.用有问题的ATL组件来测试,仍有问题,说明不是脚本写错
3.新建一个MFC的ActiveX组件,可以正常响应,说明问题可能出在ATL中
4.注意到新建ATL对象的时候有几种ATL类型,可能适用的是Simple Object、Full Control、Lite Control三种,出问题的这个属于Simple Object,于是尝试其他两种类型,发现Lite Control同样有问题,Full Control却正常。
5.它们三者的区别在于实现了不同的接口,Full Control最多,Lite Control次之,Simple Object最少。
6.建立一个Full Control,逐一去掉它实现的接口,测试减少到什么时候无法正常响应事件,说明那个应该是关键接口
7.去掉 IProvideClassInfo和IProvideClassInfo2之后,事件无法响应,说明这两个接口很可能就是所找的关键接口
8.为Simple Object增加了对这两个接口的实现:
在继承部分增加一句:
public IProvideClassInfo2Impl<&CLSID_TestCtrl, &DIID__ITestCtrlEvents, &LIBID_TEST4Lib>,
在BEGIN_COM_MAP中增加两句:
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
之后能够正常响应事件
至此问题解决。
分析:
经查MSDN,接口IProvideClassInfo的作用是提供类型信息接口ITypeInfo,那么,它在脚本中起什么作用呢?
我们知道,VB和脚本由于无法构建VTable,所以都是采用后绑定的方式工作的,也就是说,它们在调用的时候才临时根据名字去找该调用哪段代码。它怎么才能找到这段代码呢?唯一能够为它提供足够信息的,就是ITypeInfo这个标准接口。所以,对象才必须实现这个接口。
提示:纯技术文章,我花了将近两天的时间才解决,发出来希望能为遇到此类问题的人解惑,转载请注明出处(asnowwolf.blog.hexun.com)
学VC没多久,遇到一个问题:自己写的ATL组件触发了一个事件,却无法被脚本响应。于是开始着手解决这个问题,步骤如下:
1.先写了一个测试页面,以便简化问题,防止其他因素的干扰
2.用有问题的ATL组件来测试,仍有问题,说明不是脚本写错
3.新建一个MFC的ActiveX组件,可以正常响应,说明问题可能出在ATL中
4.注意到新建ATL对象的时候有几种ATL类型,可能适用的是Simple Object、Full Control、Lite Control三种,出问题的这个属于Simple Object,于是尝试其他两种类型,发现Lite Control同样有问题,Full Control却正常。
5.它们三者的区别在于实现了不同的接口,Full Control最多,Lite Control次之,Simple Object最少。
6.建立一个Full Control,逐一去掉它实现的接口,测试减少到什么时候无法正常响应事件,说明那个应该是关键接口
7.去掉 IProvideClassInfo和IProvideClassInfo2之后,事件无法响应,说明这两个接口很可能就是所找的关键接口
8.为Simple Object增加了对这两个接口的实现:
在继承部分增加一句:
public IProvideClassInfo2Impl<&CLSID_TestCtrl, &DIID__ITestCtrlEvents, &LIBID_TEST4Lib>,
在BEGIN_COM_MAP中增加两句:
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
之后能够正常响应事件
至此问题解决。
分析:
经查MSDN,接口IProvideClassInfo的作用是提供类型信息接口ITypeInfo,那么,它在脚本中起什么作用呢?
我们知道,VB和脚本由于无法构建VTable,所以都是采用后绑定的方式工作的,也就是说,它们在调用的时候才临时根据名字去找该调用哪段代码。它怎么才能找到这段代码呢?唯一能够为它提供足够信息的,就是ITypeInfo这个标准接口。所以,对象才必须实现这个接口。
相关文章推荐
- 网页脚本中无法响应ATL事件的解决办法
- UIScrollView无法响应touch事件的解决办法
- 『IOS』UIScrollView无法响应touch事件的解决办法
- UIScrollView无法响应touch事件的解决办法
- Gridview Row事件响应方法无法获取其它UpdatePanel中控件数据的解决办法
- 关于XTToolkitPro中DialogPanes无法响应OnDockingPaneNotify事件的解决办法。
- 页面加UIPanGestureRecognizer手势后,无法响应tableViewCell点击事件的解决办法
- iOS11自定义导航栏标题,位置有偏差并且无法响应点击事件和手势的解决办法(Swift)
- UIScrollView无法响应touch事件的解决办法
- 进行animation时点击事件无法响应的解决办法(animation进行时默认是禁止交互)
- [MFC] 无法响应OnMouseLeave事件的若干种解决办法
- LR录制脚本,ie无法打开,录制事件为空,解决办法
- 页面加UIPanGestureRecognizer手势后,无法响应tableViewCell点击事件的解决办法
- 关于XTToolkitPro中DialogPanes无法响应OnDockingPaneNotify事件的解决办法
- bsf窗口无法正常闪动和任务栏事件响应的解决办法
- DUI 响应选择行事件后,在本行再次点击无法响应选择行事件的解决办法
- Silverlight Canvas 无法响应KeyDown事件解决办法
- ionic开发——百度地图InfoWindow信息窗口上添加按钮,无法触发点击事件问题解决办法
- wampserver安装后,在www文件夹下面写php文件,而在网页里输入localhost而无法打开php文件时解决办法
- 解决UIWebView无法响应_doPostBack事件问题