问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ATL的ATL基本技术

发布网友 发布时间:2023-04-09 20:09

我来回答

1个回答

热心网友 时间:2023-09-11 02:04

虽然使用ATL开发COM 应用是一件非常简单的事情,但是在ATL简单易用的界面后面却包含着复杂的技术。面对ATL生成的大量代码,我们即使不去深入地了解这些代码的含义也可以开发出COM应用来,但是如果我们要充分地挖掘ATL的潜力,开发出更灵活、强大的COM应用,则必须对ATL使用的基本技术有所了解。研究ATL的实质最好的教材就是由Visual C++提供的ATL源代码。本文这一部分只是对ATL中用到的最基本的技术进行简单的介绍。
简单地说来,ATL中所使用的基本技术包括以下几个方面:
COM技术
C++模板类技术(Template)
C++多继承技术(Multi-Inheritance)
COM技术是理解ATL的基础,使用ATL进行开发要对COM技术的基本概念有最低限度的了解。由于COM是一项非常复杂庞大的技术体系,限于本文的篇幅,这里不再赘述。对于本文中提到的COM基本概念也不做过多的解释,请读者参阅有关的参考书籍。
作为ATL最核心的实现技术的模板是对标准C++语言的扩展,但是在大多数的C++编程环境中,人们很少使用它,这是因为模板的功能虽然很强,但是它内部机制比较复杂,需要比较多的C++知识和经验才能灵活地使用它。在MFC中的CObjectArray等功能类就是由模板来定义的。完全通过模板来定义程序的整体类结构,ATL是迄今为止做得最为成功的。
所谓模板类简单地说是对类的抽象。我们知道C++语言用类定义了构造对象(这里指C++对象而不是COM对象)的方式,对象是类的实例,而模板类定义的是类的构造方式,使用模板类定义实例化的结果产生的是不同的类。因此可以说模板类是“类的类”。
在C++语言中模板类的定义格式如下:
注意:<;和>;是左右尖括号,可能无法正常显示。 template<classT>classMyTemp{MyTemp<T>(){};~MyTemp<T>(){};intMyFunc(inta);}………….IntMyTemp<T>::MyFunc(inta){}首先使用C++的关键字“template”来声明一个模板类的定义。在关键字后面是用尖括号括起来的类型参数。正是根据这个类型参数,编译器才能在编译过程中将模板类的具体定义转化为一个实际的类的定义,即生成一个新的类。接下来的定义方式与普通的类定义十分相似,只是在类的函数定义中都要带有类型参数的说明。
下面的程序段说明了模板类的用法: typedefMyTemp<MyClass>myclassfromtemp;myclassfromtempm;inta=m.Myfunc⑽;通常在使用模板类时为了方便起见,使用一个关键字“typedef”为新定义出来的类取一个名字。在上面的程序段中假设“MyClass”是一个由用户定义的类,通过将这个类的名字作为类型参数传递给模板类,我们可以创建一个新的类,这个类的行为将以模板类的定义为基础,例如它具有模板类定义的所有成员函数,同时这个类又是对模板类行为的一种修改,这种修改是通过用户提供的类型参数来实现的。赋予模板类以不同的类型参数,则得到行为框架相似但具体行为不同的一组类的集合。有了新的类的定义以后,我们可以象使用普通类一样来创建一个类的实例,即一个新的对象,并且调用这个对象的成员函数。
模板类是对标准C++语言的最新扩展,虽然它的功能很强大,但是要想使用好模板类需要相当多的关于语言和编程的经验和知识,而且错误地使用模板类又会对程序的结构和运行效率带来大的副作用,因此一般的编程环境和编程书籍对模板类的使用都采取谨慎的态度。而ATL的核心就是由几十个模板类构成的,通过研究ATL的源代码可以使我们对模板类的使用有比较深刻全面的认识。
多继承技术同模板一样,是C++语言中极具争议性的技术。使用多继承技术可以使程序的设计和实现更加灵活,但是,由于多继承的复杂性和自身概念上的一些问题,使多继承在各种面向对象的语言环境中得到的支持都非常有限。例如Small Talk根本就不允许多继承,同样MFC也不支持多继承技术。
多继承最大的问题是所谓的“钻石结构”。例如下面的代码: classA{.....};classB:publicA{...};classC:publicA{.....};classD:publicC,B{........}由于类D同时从类C和B继承,因此在下面的语句中就会发生歧义: D*pD=newD;(A*)pD->Func(...);由于类D通过类C和类B 分别继承了类A,这里的强制转化就会发生歧义。
ATL使用了C++最新规范中加入的两个运算符号static_cast、dynamic_cast代替简单的强制转化,从而消除多继承带来的歧义。使用这两个运算符号,我们可以在对象运行过程中获取对象的类型信息。上面的代码可以采用下面的方式修改: D*pD=newD;static_cast<A*>(static_cast<B*>(pD))->Func(...);为什么模板类和多继承技术会成为ATL主要的工具呢?原因在于,采用模板可以在编译过程中快速的生成具有用户定制功能的类,这对于COM这样一个复杂的技术体系在实现效率上得到了很大的提高。通过使用模板类,用户可以把精力集中在自己开发的类的基本逻辑上,在完成了自己的类的设计以后,通过继承不同的模板类,生成不同的类,就可以快速地实现COM的功能,同时又避免了采用单继承结构造成的大量功能冗余。
总之,正是由于在设计实现过程中采用了模板类和多继承技术,才使ATL成为一个小巧灵活的COM开发工具,能够适应开发人员对COM应用开发的各种需要。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
mrna转录试剂盒 windows7应用程序损坏或丢失怎么办? 联想windows7怎么恢复不小心删除的应用 Win7电脑图标不见了如何恢复解决Win7电脑图标丢失问题的有效方法_百 ... 美女主播软件有哪些 什么软件看美女直播? 什么视频直播软件可以免费看女神直播? 钣金工业设计 钣金灰本段用途 关于刮胡子的相关问题 兰州地铁冬天几点停运 兰州地铁啥时间人最少 兰州地铁几点停运? _膺的读音_膺的读音是什么 云闪付有什么用途,云闪付怎么用? 兔子本领怎么画 试管苗土壤前,要进行壮苗处理。什么是壮苗处理? 汽车空调抽真空只是把制冷系统中的空气抽出来吗? 你好刚才你说的移到小的地方壮苗是什么意思 呢?谢谢了 壮苗的解释 腾讯客服人工电话95188怎么找回在吗?我微信*了哪里违规了我不清楚 微信社交场景被限制了怎么解除? 稳住的网络解释稳住的网络解释是什么 男生给女生备注铁是什么意思? 老铁稳什么意思? 太常乐章三十首其二十八皇帝南郊回御楼将索原文_翻译及赏析 题农父庐舍赏析 300014 亿纬锂能三季报 亿纬锂能为什么利润低?亿纬锂能三季度财报预告?300014 亿纬锂能是做什么的? 亿纬锂能为什么一路下跌?2021年亿纬锂能业绩预测?亿纬锂能(300014)? 莎普爱思真能治疗白内障吗 莎普爱思真的能治疗白内障吗?为什么有人坚持用了一年最后还是失明了? onenetwork这两天打不开 翻译:帮忙把这句话翻译下,麻烦各位了!万分感谢! 乌鲁木齐飞银川几个小时 乌鲁木齐银川路属于哪个区 乌鲁木齐到银川的火车什么时候恢复 从乌鲁木齐到银川有多少个服务区 乌鲁木齐市米东区有银川市好吗 固原回乌鲁木齐经过银川吗 求藏头诗里面要带余淞我爱你 唐朝诗《马》淞浚墨雨书 12月1日为什么支付宝灰色了 为什么12月1日支付宝变灰色 支付宝怎么是打开还是灰色 支付宝进入页面怎么是灰色的 支付宝app打开是灰色的 安阳到南通物流有没有 南京到义乌物流专线介绍 南京到义乌物流公司哪家好 发扬内涵的优点和缺点是什么