【发布时间】:2013-01-13 23:15:15
【问题描述】:
我正在将 Excel 宏移植到 Qt/C++。
此宏使用 ActiveX 和 COM 与另一个应用程序通信(Pulse Labshop 来自 Brüel & Kjaer)。
Excel 宏通过 WithEvents 变量拦截 Labshop 通知。
如何在 C++ 中实现相同的行为? Qt 信号/槽机制在这里似乎不可行...
【问题讨论】:
我正在将 Excel 宏移植到 Qt/C++。
此宏使用 ActiveX 和 COM 与另一个应用程序通信(Pulse Labshop 来自 Brüel & Kjaer)。
Excel 宏通过 WithEvents 变量拦截 Labshop 通知。
如何在 C++ 中实现相同的行为? Qt 信号/槽机制在这里似乎不可行...
【问题讨论】:
WithEvents 是 VB 和 VBA 中用于调用 VB 运行时代码的关键字,该代码执行使用the COM Connectable Objects architecture 设置回调机制所需的一切。
您需要阅读此架构及其相关接口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 许可证已过期。
【讨论】: