我正在为脚本语言编写本机COM / Ole / ActiveX包装器。 我需要一些建议来实现事件/回调(比如来自Microsoft.XMLHTTP对象的onreadystatechange)
我注意到一些COM对象可以通过IDispatch接口调用我的自定义对象。这是管理事件的唯一方法吗?
答案 0 :(得分:4)
如果你问的是关于COM事件如何工作的更普遍的问题(来自任何客户端,不仅仅是对安全性有一些特定要求的IE等)以及如何公开你的对象的事件,那么有一个很好的CodeProject article,Understanding COM Event Handling,其中包含有关COM事件处理如何工作的大量详细信息。加上C ++示例(不依赖于ATL或MFC)来说明如何托管事件。警告:这是一篇非常复杂的文章,但是如果你能够理解并理解它,那么你将对COM事件的工作方式有一个很好的背景。
如果您特别询问如何将您的COM对象公开到javascript中以便可以从Internet Explorer中调用它们,那么how to create an activex control that fires events to javascript (without using ATL)是一篇很好的博客文章,可以准确地讨论您的需求(如标题所示)将您的COM对象暴露给javascript,包括所有特定于IE的goo。
顺便说一下,除非你有充分的理由不这样做,否则我建议使用ATL来处理你的COM支持,暴露你的事件等等。你可以用普通的,无依赖的C ++来做(如上文所述)但ATL使事情变得更容易。一个合理的起点是MSDN的ATL Events部分,但在深入了解MSDN之前,我肯定会首先阅读CodeProject文章中的一些一般背景信息。回答有关IDispatch和事件的特定问题:事件不必使用IDispatch,客户端可以直接与您的C ++事件处理程序实现进行对话。但大多数情况下,如果您希望您的事件由IE,javascript,VB6和其他仅自动化应用程序处理(“automation”是客户端仅使用IDispatch调用属性,方法和事件的COM术语在COM对象上)。出于这个原因,大多数事件发送应用程序使用所谓的“双接口”(在其C ++实现中)从IDispatch和您的自定义事件接口继承,并最终调用相同的代码。 ATL使构建这样的双接口COM组件变得非常容易。