ATL实战开发指南--活动模板库3.1

来源:互联网 发布:第七封印知乎 编辑:程序博客网 时间:2024/05/23 00:07

ATL的提出时基于这样一个理念:开发一种框架结构,使得通过它可以更加方便的建立小型的,快速的,基于COM的组件。

小型: 不必依赖于任何辅助的DLL文件,其中也包括标准C运行时的DLL。

快速:根据程序向导自动生成,当然这个是在Visual C++ 的Developer Studio IDE中才有的

基于COM组件: 对低级别的COM功能的内置式支持, 如IUnknown, 类工厂和自注册功能, 支持微软的接口定义语言, 提供了对自定义的

Vtable接口的调度支持, 以及通过类型库进行自描述的功能。

他还有以下功能:

ATL支持IDispatch 和 dual interfaces, 支持开发效率更高的ActiveX控件, 以及提供 基本的视窗功能的支持

ATL的不适用于创建有大量显示功能的组件。


那我们现在来看一下ATL的框架:
我们在前一章知道了:COM组件需要一个DLL或者EXE宿主,也需要一个类工厂, 同时也需要自注册,这些事每一个组件所必备的共同的东西。

 1. ATL对组件的宿主支持: 

ATL在它的CComModule类里封装了一个组件的宿主支持。它对开发者掩盖了两种宿主类(DLL和EXE)之间的大部分差别。向导程序也为你生成了宿主程序的代码。

2. 对IUnknown的支持

它也实现了IUnknown, 理解他的实现,对我们在程序中究竟用哪一个宏至关重要。

3. 对类工厂的支持

在ATL中也不必为你的组件实现类工厂。ATL在CComClassFactory里提供了对基本的类工厂的支持,通过CComClassFactory2对获得许可的类工厂提供了支持 (?)

并通过CComClassFactorysingleton为单元素类工厂提供了支持。我们可以在组件的实现中,添加ATL的宏来实现不同的功能。

4.对COM程序开发的其他方面的支持

ActiveX控件                          CcomControl、IoleControlImpl、IoleObjectImpl等都支持控件的开发。IPropertyPageImpl、ISpecifyPropertyPageImple支持属性页面自动化(Automation)IDispatchImpl处理自动化和双向接口COM的数据类型CComBSTR和CComVariant接口指针的管理CComPtr 和  CComQIPtr错误处理ISupportErrorInfoImpl 和CComObject连接点(connection  points) IConnectionPointContainerImpl和IConnectionPointImpl异步属性下载CBindStatusCallback自注册ATL的注册对象(Registrar object、Iregistrar)为你的组件提供自注册功能视觉和对话框Cwindow、CwindowImpl、CDialogImpl和CmessageMapCOM的功能项                ATL的支持类

使用Visual C++向导程序创建ATL工程:

(当然以后遇到某些问题,你还是需要知道向导程序到底为你做了些什么)下面是在vs2008环境下的操作

new project------Project type 下的Visual C++ 右边选择ATL project--然后next---在application setting页面下

上面三个是服务器的类型,这个我们前面几章提到的。上面勾DLL类型,下面Additional options有三项:

第一项: 如果你提供了参数在进程间调度(marshaling),该选项将使你的组件的宿主文件可以作为一个代理/占位DLL文件。

第二项:向导程序将为MFC的头文件添加#include, 同时也为MFC的CWinApp类添加附加的代码

第三项:我也不是很懂,这是摘抄过来的{COM+是什么?是微软提出的一种创建分布式应用程序的解决方法。分布式应用程序的特点是巨大,非常的复杂。但是任何分布式应用程序都需要解决一些共性问题,比如:安全、并发、网络传输的可靠性等。但是这些共性问题都是需要耗费极大的人力、物力、财力,而且最关键的是,绝大多数的项目开发队伍是不具备这种专业素质的。如何能够将项目开发人员的负担减少到最轻,使他们只需要考虑与业务相关的编码?很多大公司进行了这些探索,微软的解决方案就是COM+}

上面创建的起始工程仅仅为你的组件提供基本的宿主文件支持,你还需要添加COM对象。也可以通过Add--class--这里列出来了好多项,可以供你选择,这里根据需要我选择ATL simple object,然后弹出一个对话框:


Shot name;该项为该页面里的其他项提供了一个基础名称;或称为前缀。

Class : 该名称用在实现组件的C++类里

.h file and .cpp file; 组件类的头文件和实现文件

CoClass;  COM类的名称。外部的客户程序使用该名称来描述组件的类型。就像之前的CMath

Interface ; 为你的对象所创建的接口名称。就像之前的IMath 、IAdvancedMath

Type; 放置在注册表里的可读的组件名称。

ProgID; 这是组件的一个标识符,该标识符是在程序里使用的。客户程序可以使用该标识符来定位并实现一个组件

然后在next后:


 这里先简单介绍一下概念,以后细讲:

Threading model:

Single: 组件的实例只能在某一进程里的主线程里创建

Apartment: 组件的实例可以存在它们自身的单元(Apartment)线程里

Free:  它必须和其它线程一起位于多线程单元里

Both: 支持Free 和 Apartment线程模型

Interface:

custom: 就是2.1和2.2里提到的标准Vtable接口

dual: 微软推荐组件支持dual接口。因为它既实现了一个Vtable接口, 也实现了标准的自动化接口(Standard Automation Interface)

Aggregation:
使得组件可以兼并或复用其它组件的功能。

Support :

ISupporErrorInfo :这种设置提供了一个具有鲁棒性的、服务器到客户机的错误汇报机制

Connection points: 连接点使一个客户程序和服务器程序在对等的基础上彼此进行通讯。






0 0