VC6创建COM组件,Qt调用例子

来源:互联网 发布:数据存储计量单位 编辑:程序博客网 时间:2024/06/08 01:18

源代码见:http://download.csdn.net/detail/cibiren2011/9867284

一、建立 ATL 工程

  步骤2.1:建立一个工作区(WorkSpace)。

  步骤2.2:在工作区中,建立一个 ATL 工程(Project)。示例程序叫 June12,并选择DLL方式,见图一。


图一、建立 ATL DLL 工程

  Dynamic Link Library(DLL) 表示建立一个 DLL 的组件程序。

  Executable(EXE) 表示建立一个 EXE 的组件程序。

  Service(EXE) 表示建立一个服务程序,系统启动后就会加载并执行的程序。

  Allow merging of proxy/stub code 选择该项表示把“代理/存根”代码合并到组件程序中,否则需要单独编译,单独注册代理存根程序。代理/存根,这个是什么概念?还记得我们在上回书中介绍的吗?当调用者调用进程外或远程组件功能的时候,其实是代理/存根负责数据交换的。关于代理/存根的具体变成和操作,以后再说啦......
  二、增加 ATL 对象类

  步骤3.1:菜单 Insert\New ATL Object...(或者用鼠标右键在 ClassView 卡片中弹出菜单)并选择Object 分类,选中 Simple Object 项目。见图二。


图二、选择建立简单COM对象

  Category Object 普通组件。其中可以选择的组件对象类型很多,但本质上,就是让向导帮我们默认加上一些接口。比如我们选 "Simple Object",则向导给我们的组件加上 IUnknown 接口;我们选 "Internet Explorer Object",则向导除了加上 IUnknown 接口外,再增加一个给 IE 所使用的 IObjectWithSite 接口。当然了,我们完全可以手工增加任何接口。

  Category Controls ActiveX 控件。其中可以选择的 ActiveX 类型也很多。我们在后续的专门介绍 ActiveX 编程中再讨论。
  Category Miscellaneous 辅助杂类组件。
  步骤3.2:增加自定义类 CMyObject(接口 IMyObject) ,见图三。


图三、输入类中的各项名称

   其实,我们只需要输入短名(Short Name),其它的项目会自动填写。没什么多说的,只请大家注意一下 ProgID 项,默认的 ProgID 构造方式为“工程名.短名”。

   步骤3.3:填写接口属性,见图四。

图四、接口属性

  Threading Model 选择组件支持的线程模型。COM 中的线程,我认为是最讨厌,最复杂的部分。COM 线程和公寓的概念,留待后续介绍。现在吗......大家都选 Apartment,它代表什么那?简单地说:当在线程中调用组件函数的时候,这些调用会排队进行。因此,这种模式下,我们可以暂时不用考虑同步的问题。

   Interface 接口基本类型。Dual 表示支持双接口,这个非常 非常重要。(经试验,如果不选Dual ,而选Custom,则Qt应用程序调用起来有问题。)

   Aggregation 我们写的组件,将来是否允许被别人聚合使用。Only 表示必须被聚合才能使用,有点类似 C++ 中的纯虚类,你要是总工程师,只负责设计但不亲自写代码的话,才选择它。

  Support ISupportErrorInfo 是否支持丰富信息的错误处理接口。以后就讲。
  Support Connection Points 是否支持连接点接口(事件、回调)。以后就讲。 

  四、添加接口函数


图五、调出增加接口方法的菜单


图六、增加接口函数 Add

  请严格按照图六的方式,增加Add()函数;[in]表示参数方向是输入;[out]表示参数方向是输出;[out,retval]表示参数方向是输出,同时可以作为函数运算结果的返回值。一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。


图八、接口函数定义完成后的图示
     
  我们都知道,要想改变 C++ 中的类函数,需要修改两个地方:一是头文件(.h)中类的函数声明,二是函数体(.cpp)文件的实现处。而我们现在用 ATL 写组件程序,则还要修改一个地方,就是接口定义(IDL)文件。别着急 IDL 下次就要讨论啦。

  五、实现接口函数

  鼠标双点图八中CFun\IFun\Add(...)就可以开始输入函数实现了:

STDMETHODIMP CMyObject::Add(long n1, long n2, long *pVal) {  *pVal = n1 + n2;  return S_OK; }

    1、自己先按照今天讲的内容写出这个组件;

   2、不管你懂不懂,一定要去观察 IDL 文件,CPP 文件;

   3、编译后,看都产生了些什么文件?如果是文本的文件,就打开看看;


============================Qt调用这个控件===================================================

上述COM控件编译,注册后



新建立一个Qt控制台程序 

注意两点

1.  在.pro文件中:

CONFIG += qaxcontainer

2.初始化COM库,并加必要的头文件


Main.cpp文件: