我目前正在尝试构建一个C++库(DLL文件),用于与COM组件进行接口交互,以使其可在Java中使用。我的想法是,我将构建一个非常小的C++ DLL,并使用一个“包装”COM组件的类,然后使用SWIG导出它。通过使用#import语句,我已经取得了相当大的进展:
#import "ComponentName.dll"
我需要调用CoInitialize()函数并通过由Visual Studio生成的IComponentNamePtr类创建组件实例。这对于所有常规的COM方法调用都有效,这很好。
然而,我不知道如何使事件起作用。我看到有一个IComponentNameEventsPtr与主“智能指针”类相辅相成,但我不知道该怎么做才能让它起作用。
我尝试了以下所有方法来使事件起作用:
- Pure C++ — 我不知道如何做到这一点。我尝试创建一个继承自IComponentNameEvents类的新类,为所有抽象函数创建存根,并重写函数,但是函数没有标记为虚函数,因此无法正常工作。
- MFC — 我无法正确调用AfxOleInit。谷歌搜索告诉我,在从DLL调用时,调用会失败,因为它假定OLE已经初始化。我不太确定如何修复这个问题。每次尝试创建COM组件实例时,我的库都会崩溃(我认为是因为COM未正确初始化)。
- ATL — 我不知道如何在ATL中处理事件。我可以通过“简单ATL”向导,然后“实现接口”向导创建类,但不能理解如何使用它。我阅读了MSDN上的IDispEventImpl使用,但无法理解如何使用该教程生成的类。我是否也需要通过ATL使用COM对象(或者可以使用自动生成的#import类)?如何“附加”事件侦听器类?
- 我阅读了COM中的事件处理,该文档使用event_receiver属性(属于新的Visual C++统一事件模型)。最初,我无法弄清如何将其与通过#import语句创建的COM组件的使用结合起来。我最终弄清楚了(该页面上也提到了!),我需要在#import语句上使用“embedded_idl”标志,但这破坏了其他事情(在.tlh文件中出现了一堆“expecting a type specification near”错误)。
有人知道如何做到这一点吗?采取什么最简单的方法?我的背景是C#和PHP,所以我在使用C ++中的COM方面没有太多经验。
tldr:在C ++ DLL中使用COM事件的最简单方法是什么?