电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

ActiveX Template Library-(ATL)简介二


发布日期:2024/8/26
 

ATL基本技术

虽然使用ATL开发COM 应用是一件非常简单的事情但是在ATL简单易用的界面后面却包含着复杂的技术面对ATL生成的大量代码我们即使不去深入地了解这些代码的含义也可以开发出COM应用来但是如果我们要充分地挖掘ATL的潜力开发出更灵活强大的COM应用则必须对ATL使用的基本技术有所了解研究ATL的实质最好的教材就是由Visual C++提供的ATL源代码本文这一部分只是对ATL中用到的最基本的技术进行简单的介绍

简单地说来ATL中所使用的基本技术包括以下几个方面

COM技术

C++模板类技术(Template)

C++多继承技术(MultiInheritance)

COM技术是理解ATL的基础使用ATL进行开发要对COM技术的基本概念有最低限度的了解由于COM是一项非常复杂庞大的技术体系限于本文的篇幅这里不再赘述对于本文中提到的COM基本概念也不做过多的解释请读者参阅有关的参考书籍

作为ATL最核心的实现技术的模板是对标准C++语言的扩展但是在大多数的C++编程环境中人们很少使用它这是因为模板的功能虽然很强但是它内部机制比较复杂需要比较多的C++知识和经验才能灵活地使用它在MFC中的CObjectArray等功能类就是由模板来定义的完全通过模板来定义程序的整体类结构ATL是迄今为止做得最为成功的

所谓模板类简单地说是对类的抽象我们知道C++语言用类定义了构造对象(这里指C++对象而不是COM对象)的方式对象是类的实例而模板类定义的是类的构造方式使用模板类定义实例化的结果产生的是不同的类因此可以说模板类是类的类

在C++语言中模板类的定义格式如下

template < class T>

class MyTemp

{

MyTemp( ){ };

~MyTemp( ) { };

int MyFunc( int a) ;

}

…………

Int MyTemp::MyFunc( int a)

{

}

首先使用C++的关键字template来声明一个模板类的定义在关键字后面是用尖括号括起来的类型参数正是根据这个类型参数编译器才能在编译过程中将模板类的具体定义转化为一个实际的类的定义即生成一个新的类接下来的定义方式与普通的类定义十分相似只是在类的函数定义中都要带有类型参数的说明

下面的程序段说明了模板类的用法

typedef MyTemp myclassfromtemp;

myclassfromtemp m;

int a = mMyfunc();

通常在使用模板类时为了方便起见使用一个关键字typedef为新定义出来的类取一个名字在上面的程序段中假设MyClass是一个由用户定义的类通过将这个类的名字作为类型参数传递给模板类我们可以创建一个新的类这个类的行为将以模板类的定义为基础例如它具有模板类定义的所有成员函数同时这个类又是对模板类行为的一种修改这种修改是通过用户提供的类型参数来实现的赋予模板类以不同的类型参数则得到行为框架相似但具体行为不同的一组类的集合有了新的类的定义以后我们可以象使用普通类一样来创建一个类的实例即一个新的对象并且调用这个对象的成员函数

模板类是对标准C++语言的最新扩展虽然它的功能很强大但是要想使用好模板类需要相当多的关于语言和编程的经验和知识而且错误地使用模板类又会对程序的结构和运行效率带来大的副作用因此一般的编程环境和编程书籍对模板类的使用都采取谨慎的态度而ATL的核心就是由几十个模板类构成的通过研究ATL的源代码可以使我们对模板类的使用有比较深刻全面的认识

多继承技术同模板一样是C++语言中极具争议性的技术使用多继承技术可以使程序的设计和实现更加灵活但是由于多继承的复杂性和自身概念上的一些问题使多继承在各种面向对象的语言环境中得到的支持都非常有限例如Small Talk根本就不允许多继承同样MFC也不支持多继承技术

多继承最大的问题是所谓的钻石结构例如下面的代码

class A

{

};

class B : public A

{

};

class C : public A

{

};

class D : public CB

{

}

由于类D同时从类C和B继承因此在下面的语句中就会发生歧义

D* pD = new D;

(A*)pD>Func();

由于类D通过类C和类B 分别继承了类A这里的强制转化就会发生歧义

ATL使用了C++最新规范中加入的两个运算符号 static_castdynamic_cast代替简单的强制转化从而消除多继承带来的歧义使用这两个运算符号我们可以在对象运行过程中获取对象的类型信息上面的代码可以采用下面的方式修改

D* pD = new D;

static_cast(static_cast(pD))>Func();

为什么模板类和多继承技术会成为ATL主要的工具呢?原因在于采用模板可以在编译过程中快速的生成具有用户定制功能的类这对于COM这样一个复杂的技术体系在实现效率上得到了很大的提高通过使用模板类用户可以把精力集中在自己开发的类的基本逻辑上在完成了自己的类的设计以后通过继承不同的类生成不同的模板类就可以快速地实现COM的功能同时又避免了采用单继承结构造成的大量功能冗余

总之正是由于在设计实现过程中采用了模板类和多继承技术才使ATL成为一个小巧灵活的COM开发工具能够适应开发人员对COM应用开发的各种需要

上一篇:换种思路创建Windows系统特殊文件夹

下一篇:用活用足Windows系统中的搜索功能(组图)