即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

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

编程语言 cibiren2011 36℃ 0评论
本人在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 文件中,即可正常使用。注意使用命名空间前缀。
 
转自:http://www.qtcn.org/bbs/read.php?tid=23559

转载请注明:CodingBlog » Windows下,运用dumpcpp 方式访问 COM 接口的办法

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情