![]() |
1
3
更新(从插件发布事件)好的,我也这么认为 女朋友 另外,我看到期望的机制是相反的——从DOM之外提供的组件发出事件。 这与MSHTML事件的处理方式类似,但插件的对象需要使用不同的机制检查提供给它的对象。 在提供事件(或支持为事件附加对象)的对象上,通过IDispatch(如果需要,还可以通过双接口)提供attachEvent和detachEvent方法。如果希望它与HTML元素无缝结合,那么应该以与IHTMlement上提供的相同的方式声明它们。dispid不必匹配,但参数和类型的顺序应该匹配。
attachEvent Method (IHTMLElement2) @ MSDN
通过attachEvent接收呼叫时,需要将事件名称与接收的对象相关联。类似地,当您通过detachEvent接收调用时,需要清除对象和事件名称的关联。 当您希望发出事件时,请检查您存储的所有对象,以查找与您的事件匹配的应调用的方法。理论上,您不必使用与事件名称相同的方法名称,但在实践中,如果您这样做,维护和管理将更容易。首先检查IDispatch本身,调用GetIDsOfNames()为事件找到精确匹配。如果没有,请检查IDispatchEx并通过GetDispID()查找与事件匹配的expando方法。
IDispatch Interface @ MSDN
最后,从一个或另一个找到处理程序后,调用关联的Invoke()方法。
IDispatch::Invoke @ MSDN
初始(处理预定义的MSHTML事件)大多数事件处理程序对象都是手动创建的,因为这允许它们在通过attachEvent()接收调用或分配给事件属性时通过IDispatch接受MSHTML事件。这种机制从典型的ConnectionPointContainer到COM中流行的EventSink设置都有所不同。但是,创建一个对象来处理这些事件更简单。如果要创建这样一个对象来处理事件,则应该注意一些关键的区别。
上面提到的C++头文件中的定义与IHTMlement上列出的项完全对应。这里有一个具体的项目让你开始。 首先,关闭HTMLDOM元素的事件。 onclick Property (IHTMLElement) @ MSDN 我们注意到这个属性的名称是onclick。现在,转到头文件。 我们想要的匹配项是 DISPID\u EVMETH\u ONCLICK
某些定义重叠或循环使用为一般ActiveX/OLE控件使用而定义的相同DISPID。 是在OleCtl.h中定义的,所以让我们到那里去追踪最终的值。这个头文件在平台SDK中也可用,并且默认情况下也包含在VC++安装中,至少我记得最早是VC++6.0。 我们要的DISPID是-600。
现在,在组件的IDL中,您需要声明一个名为onclick()的方法,该方法具有这个DISPID值;或者,您需要在IDispatch::Invoke()的处理程序中处理此DISPID。如果您使用的是ATL,那么声明该方法并提供双布局并没有什么坏处。其他实现可能有所不同。 开发的其余部分应该是Internet Explorer中脚本对象的典型部分。还请注意,这些dispid中的大多数都在负值范围内,以避免与用户定义的dispid发生冲突。 |
![]() |
diverger · 从Qt调用Excel中的用户定义VBA函数 7 年前 |
![]() |
user3070144 · 通过全局接口表封送ActiveX 7 年前 |
![]() |
Brutus · Qt-嵌入ActiveX控件 7 年前 |
![]() |
Bob lin · 如何在窗体控件中选择ActiveX选项/单选按钮 7 年前 |