生而自由

自由而无用的灵魂

在Qt中调用ActiveX控件

最近有一个项目需要在Qt工程中调用一个ActiveX控件,之前有在Qt的文档中看到过ActiveQt相关的文档,于是就开始仔细看了起来,刚开始看的时候有点两眼一抹黑感觉Qt的文档说得有点模糊,自己摸索了一下发现还是非常简单、非常方便的。

1.通过Qt提供的工具对COM生成头文件和实现文件

如果安装了VS的话,先用其提供的OleView.exe(在VS安装目录下,需要用全局搜索工具如everything搜索一下)来找一下你想使用的COM组件,双击查看后找到它的UUID。

然后Qt提供了一个dumpcpp.exe,用来对指定的COM接口生成.h和.cpp文件,命令也很简单传入COM组件的UUID即可,形如"dumpcpp {00000000-0000-0000-0000-000000000000}" ,然后在当前目录下就会生成对应的.h和.cpp文件了。

而且生成的类都是基于Qt的类型,使用起来相当的方便。

2.在工程中引入生成的文件,直接实例化并调用即可。

这里不详述了,使用起来很方便。

3.关于COM组件的事件(Event)与Qt的槽的绑定

某些COM组件是提供了事件(Event)的,但查看前面生成的源代码甚至可以发现dumpcpp跳过了对Event的代码生成,那么在Qt中要如何获取到事件呢?

其实在QAxBase中的signal方法已经实现了将Event转换为Qt中的signal,我们只需要像绑定Qt的signal和slot那样来绑定Event就可以了。

如COM组件中有个Printed(count As Integer)的事件,那么这样绑定即可:"connect(&axObj, SIGNAL(Printed(int)), this, SLOT(onPrinted(int)))",是不是很简单呢?

点赞
  1. Jelly说道:

    你好,我想问一下,关于第三点,dumpcpp跳过了对Event的代码生成,确实跳过了而且生成的头文件中并没有这个事件的接口,那我该怎么绑定呢?"connect(&axObj, SIGNAL(Printed(int)), this, SLOT(onPrinted(int)))",,这个axobj对象是哪个的对象??

    1. imspirit说道:

      在生成头文件之后,其中包含了一个继承了QAxObject的类,将其实例化即可,我这边实例的变量名即为axObj。 至于这个类里面有哪些事件,这个取决于COM接口的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注