查看完整版本: [-- Windows下,使用dumpcpp 方式访问 COM 接口的方法 --]

QTCN开发网 -> Qt基础编程 -> Windows下,使用dumpcpp 方式访问 COM 接口的方法 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

sand.fj.wen 2009-11-09 23:25

Windows下,使用dumpcpp 方式访问 COM 接口的方法

      本人在windows上进行开发,主要是使用 ATL 进行 COM开发,然后使用 MFC 作客户端调用COM接口。后来自己想写个辅助的开发工具,也想学习QT这个开发框架,所以就决定使用 QT 开发这个辅助的工具。但由于对 QT 不熟悉,所以不懂得如何调用 COM 接口,并且关于这方面的资料也不多。后来在 XChinux 的指导下,简单地看了下 QAxContainer模块的内容,明白了调用 COM 接口的方法还是有许多的,但我比较喜欢通过 dumpcpp 的方式生成 QT 对 COM 接口的 C++ 包装类,再调用。这里有个好处就是可以使用代码自动完成功能,而省去了通过函数原型调用还要一个一个地查看接口方法原型的工作。
      下面这些步骤主要是根据 QT 的 DUMPCPP 工具所写的,自己加以实践的成果,希望对需要这方面知识的人能够省去查找一大堆资料的麻烦。
1 使用库
    构造使用COM对象和ActiveX控件的Qt应用程序,需要向.pro文件中加入
 CONFIG += qaxcontainer
    来连接到QAxContainer模块 。
1.1. 配置QAxContainer应用程序
    QaxContainer库是静态的,因此使用这个模块的时候不需要重新分配任何额外的文件。但要注意,你所使用的提供ActiveX服务的二进制文件必须被安装在目标系统中,因此你需要把它们装在你的发布包中并在你的应用程序安装过程中为它们注册。
2. 初始化COM对象
     可以通过使用QAxBase::setControl() 或 直接把对象的名字传到QAxBase子类的构造器中来初始化一个COM对象。
     控件能通过多种格式指定,但最快且功能最强的格式是直接使用对象的Class ID(CLSID)。 Class ID能考虑到这个对象涉及别的机器时信息的变化,而且能为需要license的控件包括一个license key。
3. 访问对象API
模块提供了访问COM对象的Qt API来取代COM的数据类型。有4种方法去调用访问COM对象的API,这里只介绍第一种:
         • Generating a C++ namespace
         • Call-by-name
         • Through a script engine
         • Using the native COM interfaces
3.1. 生成 C++ 命名空间
    用dumpcpp 工具可以为想要访问的类型库生成一个C++名空间。需要手动对你要用的类型库使用这个工具, 或者也可以通过向.pro文件中的变量TYPELIBS添加类型库来把它整合到编译系统中(我自己试过,但没成功,不知道有没有人成功过,所以我使用手动生成C++包装类的方式):
            TYPELIBS = file.tlb
    注意,dumpcpp不一定能列出类型库中所有的API。 把生成的头文件包含进你的代码中,通过生成的C++类来访问对象API。 更多信息可以参考示例Qutlook。
3.2 使用 dumpcpp 工具生成类型库的步骤:
3.2.1
    先将 dumpcpp 工具所在的 bin 目录添加到系统路径中。
3.2.2
     运行 cmd 命令,打开命令行窗口,并输入如下的命令:
    其中,-n zserver 参数表示将COM接口导出为 zserver命名空间,后面花括号中的内容表示COM接口的CLSID,注意,这样导出将会在指定目录产生两个C++文件: zserver.h 与zserver.cpp,并且导出的文件中包含COM接口所在的组件的全部接口信息。即,如果zserver组件中含有 Interface1 与Interface2 两个接口,使用 dumpcpp 命令时,参数用的是 Inteface1 的接口ID,那么导出的C++文件中将包含Interface2 接口的信息。
3.2.3
   将导出的命名空间添加到 QT 工程所在的目录下,并添加到工程的 pro 文件中,即可正常使用。注意使用命名空间前缀。

luxf1212 2011-09-28 15:10

echohuhu 2012-11-27 13:17
您好 请问我的初始化为什么一直不能成功啊

song3322745 2014-05-13 19:31
你好,我这里看不到你命令行的命令,能否给我重新写一份,谢谢!

【peroylin】 2021-03-04 14:35
受益良多  可是现在调试都没问题了 运行时提示 不能初始化  该怎么办?

【peroylin】 2021-03-05 08:41
根据上面的讲解 目前能调用生成的h cpp文件内的函数   编译通过  但在运行时提示
QAxBase::qt_metacall: Object is not initialized, or initialization failed

反思下是上边介绍中的第二部“初始化”没做好 但不知道要怎么做?
求指教


查看完整版本: [-- Windows下,使用dumpcpp 方式访问 COM 接口的方法 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled