STL,ATL,WTL之间的联系和区别

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL,ATL,WTL之间的联系和区别相关的知识,希望对你有一定的参考价值。

一、STL即 Standard Template Library (标准模板库) 

     STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样你就不用重新开发它们了。你可以仅仅使用这些现成的组件。STL现在是C++的一部分,因此不用额外安装什麽, 它被内建在 你的编译器之内。

    STL容器可以保存对象,内建对象和类对象。它们会安全的保存对象,并定义我们能够操作的这个对象的接口。放在蛋架上的鸡蛋不会滚到桌上。它们很安全。因此,在STL容器中的对象也很安全。我知道这个比喻听起来很老土,但是它很正确。 

    STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。这些算法都有很著名的执行特性。它们可以给对象排序,删除它们,给它们记数,比较,找出特殊的对象,把它们合并到另一个容器中,以及执行其他有用的操作。 
    STL iterator就象是容器中指向对象的指针。STL的算法使用iterator在容器上进行操作。Iterator设置算法的边界 ,容器的长度,和其他一些事情。举个例子,有些iterator仅让算法读元素,有一些让算法写元素,有一些则两者都行。 Iterator也决定在容器中处理的方向,你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的 end() 函数来得到过去的最后一个值(就是处理停在那的那个值)。 
     这就是STL所有的东西,容器、算法、和允许算法工作在容器中的元素上的iterator。 算法以合适、标准的方法操作对象,并可通过iterator得到容器精确的长度。一旦做了这些,它们就在也不会“跑出边界”。还有一些其他的对这些核心组件类型有功能性增强的组件,例如函数对象。 
原文见:http://www.chinalinuxpub.com/doc/pro/stl.html 
二、ATL: Active Template Library (活动模板库)

    可以看一下潘爱民关于《ATL Internals》的书评: 
    ATL是一个产生C++/COM代码的框架,就如同C语言是一个产生汇编代码的框架 
    ATL又不同于MFC,它完全面向COM组件,其技术路线也不同于MFC,MFC使用的是C++中的继承、封装、嵌套等常规技术,而ATL使用了C++中模板、多继承等高级技术,甚至还用到了STL。所以学习和使用ATL要求我们必须熟悉这些C++高级特性。另一方面,ATL结构完全针对COM中的诸多规范,这就要求使用人员必须非常了解COM规范,才有可能真正把ATL用好 
    对于COM应用的开发,ATL无疑是首选的工具,与MFC相比,ATL的规模还不算大,但是从上述的介绍我们可以看出,ATL涉及到了COM的方方面面。实际上,ATL的内容还要多得多,比如OLEDB的支持、MTS的支持等,尽管如此,如果我们有了这本书中的内容为基础,那么再去学习这些扩展的内容就会容易得多,结合ATL中实现COM的基本手段加上这些应用技术的背景知识,我们可以很容易地掌握这些开发技术。 
    但是如果我们要想熟练掌握甚至精通ATL的话,那么这只是一个开头,前面还有漫长的路要走。原因有多方面,一则COM本身异常复杂,不下苦功难窥全貌;二则ATL确实奥妙很多,它体现了C++语法的博大精深;三则ATL还存在很多错误,虽然本书作者指出了一些错误,但实际的错误肯定更多,这就对ATL使用者提出了更高的要求,如果使用过程中不能发现这些错误或者避开这些错误,那么用ATL反而会阻碍我们的工作。 
    虽然ATL比较精深,但是这本书的讲解非常通俗易懂,语言比较简练,条理非常清楚。即使在读完这本书之后,它仍然可以作为参考书指导我们的开发和学习工作。我想,这就是好书的价值所在吧。 
三、WTL:Windows Templat Library   见:http://www.c-view.org/journal/006/wtl.htm

    在ATL出现的时候,一些部分COM的编程人员开始觉得开发COM运用是一种快乐,因为使用它很方便地开发小规模的COM组件,但好景不长,现实的COM组件是包罗相当广泛的,特别当它们准备使用窗口控件,发现ATL提供的相当的稀少。因此Microsoft推出了半成品与没有技术支持的WTL,这也是WTL诞生的原因。 
    很多初次接触WTL都问“WTL这三个字母代表什么呢?”:WTL全称为Windows Template Library,构架于ATL之上,采用C++模板技术来包装大部窗口控制,并给出一个与MFC相似的应用框架。他们紧跟着问“那我如何得到它呢?”:由于WTL是Microsoft推出的,在Microsoft的PlatFormSDK中就有WTL是ATL的扩展,也是由ATL小组开发,包含在Microsoft于2000年1月发布的开发平台SDK包中(也可以从Microsoft网站上下载),虽然Microsoft没有正式支持。WTL通过提供一个用于编写Win32应用程序和控制的轻量级的框架,一些特殊的视图,GDI对象和实用的类,来扩展了ATL窗口类WTL设计特性--附带地,相对于MFC的优势--包括: 
    (1) 模板化,因此有较小的代码量。例如,一个简单的“hello world”SDI应用程序,基于WTL的程序只有24KB,而MFC静态连接结果是440KB,MFC动态连接的结果是24KB+1MB。 
    (2) 无太多相关性,并且可以自由地和SDK代码直接混合。 
    (3) 不会强迫使用特定的应用程序模型,尤其相对于MFC的应用程序框架。 
1. WTL类包括: 
    (1) 标准控制(编辑框,列表框,按钮等等) 
    (2) 公共控制(包括列表视图,树形视图,进度条,微调按钮) 
    (3) IE控制(rebar,平面滚动条,日历等等) 
    (4) 命令条,菜单,和更新UI类 
    (5) 公共对话框 
    (6) 属性单和页类 
    (7) 框架窗口,MDI框架和子框架,分隔条,可滚动的窗口 
    (8) 设备环境(DC)和GDI对象类(笔、刷子、位图等) 
    (9) 打印机及其信息和设备模式类 
2. 实用工具类:包括CPoint, CRect, CSize, 和CString类 
    WTLAppWizard允许你生成SDI、MDI、多线程SDI和基于对话框的应用程序。多线程SDI应用程序就象IE或WindowsExplorer(我的电脑),看起来象是启动了多个实例,实质上它们是同一进程的多个视图。这些视图可以是普通的基于CWindowImpl的窗口,或基于窗体、列表框、编辑框、列表视图、树形视图、丰富文本编辑框或HTML控制。你可以让你的应用程序拥有rebar、命令条(如同WindowsCE)、工具条或状态条。你的应用程序可以包含ActiveX控制,甚至可以是一个COM服务器。 

    WTL = Windows Template Library,可以说起源于ATL 类库中关于Window 创建/管理的类。主要原因是用原始的 WIN32 API 编写漂亮的用户界面工作量大,繁杂。MFC 虽然提供了一套很好的封装,但是也不是很容易消化和使用,特别是各个 MFC 类之间耦合很紧,要用好 MFC 就要理解很多 MFC 内在的运行机制(有人说 MFC 的封装是“白盒”封装,呵呵)。WTL 利用 C++ 模版的高级功能,提供很联系很松散的“独立”的类库,使用起来比较方便,而且代码体积小,不必为了学习某个类必须学习一大堆相关的类。 

    但是 WTL 不是 Microsoft 官方正式支持的类库,虽然有相当多的人和越来越多的在使用;不过有可能将来会支持的。

 

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777126.html

以上是关于STL,ATL,WTL之间的联系和区别的主要内容,如果未能解决你的问题,请参考以下文章

[ATL/WTL]_[初级]_[自定义多列TreeView]

如何将 WTL 和 ATL 添加到 Visual Studio C++ Express 2008

[WTL/ATL]_[中级]_[自定义TrackBar]

[WTL/ATL]_[中级]_[自定义TrackBar]

WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)

[ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]