我正在将 Excel 宏移植到 Qt/C++。
该宏使用 ActiveX 和 COM 与另一个应用程序通信(Brüel & Kjaer的Pulse Labshop)进行通信。
Excel 宏通过WithEvents
变量拦截 Labshop 通知。
如何在 C++ 中实现相同的行为?Qt 信号/槽机制在这里似乎是不可能的......
我正在将 Excel 宏移植到 Qt/C++。
该宏使用 ActiveX 和 COM 与另一个应用程序通信(Brüel & Kjaer的Pulse Labshop)进行通信。
Excel 宏通过WithEvents
变量拦截 Labshop 通知。
如何在 C++ 中实现相同的行为?Qt 信号/槽机制在这里似乎是不可能的......
WithEvents
是在 VB 和 VBA 中用于调用 VB 运行时中的代码的关键字,该代码执行使用COM 可连接对象体系结构设置回调机制所需的一切。
您需要阅读此架构及其相关接口IConnectionPoint
等;在 C++ 代码中实现事件接收器接口;然后添加代码以使用 Pulse Labshop 的事件源注册您的接收器。
所有这些工作都是用一个“魔术”关键字完成的,这是 VB 在当时如此受欢迎的一个很好的原因。
实际上 Qt 可以从 dll 和 tlb 生成特定的 QAxObject。
对于这个项目,供应商给了我一个 tlb 文件。
在专业文件中:
TYPELIBS = lib/Pulse.tlb
TYPELIBS = $$system( dumpcpp lib/Pulse.tlb -nometaobject -o src/controller/Pulse )
然后生成一个 Pulse.h 文件。这些类有插槽和信号。所以很容易拦截事件。
它不起作用的原因是 Pulse Labshop 许可证已过期。