我正在为脚本语言编写本机COM / Ole / ActiveX包装器。 我需要一些build议来实现事件/callback(如从Microsoft.XMLHTTP对象onreadystatechange)
我注意到一些COM对象可以通过IDispatch接口调用我的自定义对象。 这是pipe理事件的唯一方法吗?
如果你问一些关于COM事件如何工作的更一般的问题(来自任何客户端,不仅仅是对安全有特殊要求的IE),以及如何暴露你的对象的事件,那么CodeProject的一篇很好的文章, 理解COM事件处理 ,它有很多关于COM事件处理如何工作的细节。 再加上一个C ++示例(不依赖于ATL或MFC)来说明如何托管事件。 警告:这是一篇非常复杂的文章,但是如果您能够理解并理解这些文章,您将对COM事件的工作方式有很好的背景。
如果你特别要求如何将你的COM对象暴露给JavaScript,以便它们可以从Internet Explorer中调用,那么如何创建一个将事件触发到javascript(不使用ATL)的ActiveX控件是一个很好的博客文章,需要(如标题所示)将您的COM对象暴露给javascript,包括所有特定于IE的goo。
顺便说一句,除非你有一个好的理由不建议,我会建议使用ATL来处理你的COM支持,暴露你的事件等等。你可以在普通的,不依赖的C ++中做到这一点(正如上面的文章所做的那样),但ATL使事情更容易。 一个合理的出发点是MSDN的ATL事件部分,但是在深入MSDN的东西之前,我肯定会先阅读一下CodeProject的一些常规背景信息。
回答有关IDispatch和事件的具体问题:事件不必使用IDispatch,客户端可以直接与您的C ++事件处理程序实现进行交谈。 但是大多数情况下,如果您希望您的事件通过IE,javascript,VB6和其他自动化应用程序(“ automation ”是COM客户端只使用IDispatch来调用COM对象的属性,方法和事件的COM术语) 。 由于这个原因,大多数事件发送应用程序使用所谓的“双接口”(在它们的C ++实现中)从IDispatch和您的自定义事件接口继承,并最终调用相同的代码。 ATL使构建这种双接口COM组件非常容易。