仓酷云

标题: 来一篇关于NET的分析ATL与WTL CString的完成机制 [打印本页]

作者: 若天明    时间: 2015-1-16 14:28
标题: 来一篇关于NET的分析ATL与WTL CString的完成机制
J2EE比较成熟一点,一些比较出名的企业应用软件都是基于J2EE的。以后的发展就不好说了。不过java比较烦,学.net的话,微软把很多工具都封装好了,学起来可能容易一点。<p>话说CString这个器材困扰了良多年老人,由于它会引发诡异的编译毛病,明天随着我一同来深切ATL、WTL头文件,来把这个器材弄个清分明楚。
【触及到头文件】
ATL:atlstr.h,atlsimpstr.h
MFC:cstringt.h、afxstr.h
WTL:atlmisc.h
ATL和MFC有关剪不休理还乱的干系,为了更简单剖析,我们先要理清这四个头文件间的干系。察看互相间察看按次,能够得出:
atlstr.h援用cstringt.h,cstring援用atlsimpstr.h,afxstr.h援用cstringt.h,由此可得出下图:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

【atlsimpstr.h都干了甚么】
1、界说了CStringData和CNilStringData类(前篇已述,此处略)
2、界说了ChTraitsBase类,类以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

此类对照复杂,功效是为分歧的字符范例,创建新的一致的称号。别的,这里利用到了模板特化手艺。
3、界说了CSimpleStringT类,此类的功效是,在ChTraitBase界说的一致称号的基本上,供应字符串一些基础的操纵功效函数。
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

t_bMFCDLL可忽视。别的,注重,此地方操纵的字符串工具,都是CStringData(前篇已述)
总述:在atlsimpstr.h中,我们发明了3个使人感乐趣的器材,CStringData是字符串操纵单位,ChTraitBase供应字符串变量一致定名服务,而CSimpStringT是一个基于CStringData字符串操纵单位的浅易的CString(注重,只是浅易,个中并未供应我们经常使用的CString中的那些函数)。
【cstringt.h都干了甚么】
1、界说了ChTraitsCRT类,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

该类承继atlsimpstr.h中的ChTraitsBase类,然后在父类供应服务的基本上,供应一系列字符串底层操纵函数。思索:为何此处用承继?而CSimpleStringT利用提typedef?
2、界说了_MFCDLLTraitsCheck类,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

 这里再一次用到了模板特化手艺,该类用于检测以后利用的StringTraits是ATL界说的仍是MFC界说的。(ATL界说的叫StrTraitATL,MFC界说的叫StrTraitMFC,前面会提到)
3、界说了CStringT类,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

 注重了,CStringT就是CString的真身!后面说到,CSimpStringT操纵CStringData字符串操纵单位,供应基础的字符串操纵功效,而CStringT承继CSimpleStringT,使用StringTraits,包装更初级的功效函数。而这些更初级的功效函数,就是我们一般挪用CString时所利用到的那些函数。
【atlstr.h都干了甚么】
1、界说了CAtlStringMgr类。(前文已述)
2、界说了ChTraitsOS类,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

和ChTraitCRT绝对应,ChTraitsOS承继atlsimpstr.h中的ChTraitsBase类,然后在父类供应服务的基本上,供应一系列字符串底层操纵函数。
和ChTraitCRT比拟,他俩供应的函数年夜部相干,多数分歧,别的不异函数名的完成纷歧定不异。
3、界说了StrTraitATL类,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

和StrTraitMFC绝对应,该类供应字符串资本办理函数和CStringData内存办理器的ATL版。
4、界说了CSTRING,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

【afxstr.h都干了甚么】
1、界说了StrTraitMFC,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

上文已述,和StrTraitATL绝对,本类供应的功效完成都关闭在MFC中。
2、界说了CString,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

【atlmisc.h都干了甚么】
翻开atlmisc.h,能够发明此文件只不外是界说了一些布局体,界说了一个CString的浅易版。由于ATLCString依附于MFC头文件,以是,假如在利用CSTRING而又不想到场过量别的文件时,WTLCSTRING供应了一个很好的选择。
一切文件都剖析后,我们发明,atl、mfc、wtl分离界说了一个CString。个中atl和mfc中的CString都是基于CStringT,只要一个中央是分歧的,即CStringT所援用的StringTrait(即StrTraitsATL仍是StrTraitMFC)。而WTLCString的完成是自力的,是一个真实的类。别的,StringTrait援用的Iterator是可选的(即底层字符串操纵封装)。
最初,我们发明ATL和MFC中触及CString的类干系有些庞大。
为何ATL和MFC的CString头文件要搅在一同?
上文的剖析有些混乱,我们经由过程一张图来加倍明晰的察看,以下:
来一篇关于NET的分析ATL与WTL CString的完成机制
登录/注册后可看大图

上图中,用圈圈住的头文件暗示ATL头文件,没被圈的代表MFC头文件。别的,在头文件中间字符,暗示各个头文件中完成的类。
如今让我们细心寓目,全部貌似均衡的计划中,实在有着良多的不屈衡。我想问:
1、为何MFC头文件cstringt.h要包括atl头文件atlsimpstr.h?为何ATL头文件要包括cstringt.h?ATL弄ATL的,MFC弄MFC的,各不干系,起不更好?
2、ChTraitOS放在atlstr.h中,而ChTraitCRT放在cstringt.h中,他俩功效是相似的,逻辑上是绝对的,为神马在文件条理上却不合错误齐,要云云的别扭?
话说中国人对待成绩的时分,常常把某一年夜类看做一挥而就的完善的全体。比如Tencent很赢利,很年夜,产物推出快,人们就以为Tencent外部有着优秀的构造架构。这里我要告知人人的是,任何年夜范围的器材,都是一点一滴堆集起来的。ATL也是,MFC也是。这两个器材不是一个月、两个月的开辟就成了如今的模样的,他们都是慢慢叠加,慢慢改善才成了明天这个壮大的库的。扯了这些,是要告知人人,要以变更、堆集、静态来对待和剖析事物的衍生。
好了,如今我们来看为何微软会弄出这么别扭的布局。
话说,某一天ATL开辟小组发明总是操纵char,太低效,STL的string也不是很好用,因而乎,他们做了一个为ATL服务的复杂的字符串类,名字叫CSimpleStringT,经由过程typedef,界说成了CSimpleString。
后天某一天,MFC的人也发明char和string超欠好用,他们发明公司的ATL小组已做了一个成熟CSimpleString类,因而MFC小组拿来间接利用。在利用中,MFC小组的人发明CSimpleString做的太复杂了,有良多的功效,它都不供应,别的,类函数计划的也欠好用。因而MFC小组的成员决意扩大CSimpleString,他们将扩大的代码写进cstringt.h中,别的抽离出对外的接行动文件afxstr.h,将界说放在了这。(到这里,我们发明了下面提到成绩的产生点,MFC的头文件承继了ATL头文件)。
<p>又到厥后,MFC小组的某个成员(主程级)转到了ATL小组,离开ATL小组后,他发明,常日用惯了CString,如今要用CSimpleString真TM憋屈,因而他倡议在ATL中自封装一个CStrnig。ATL小组发明,继然MFC的CString已做得这么成熟不乱且好用了,本人没需要再重整旗鼓,别的,他们发明cstringt.h是自力于MFC别的文件的,固然属于MFC小组(MFC小组所写),可是援用的却都是atl的头文件,因而,援用cstringt.h不会融进MFC别的旁年夜的文件,因而可行。以是综合以上思索,ATL小组间接承继于cstringt头文件,派生了本人的CString,放在了atlstr.h中它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。
作者: 分手快乐    时间: 2015-1-18 14:42
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: 仓酷云    时间: 2015-1-23 19:27
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 老尸    时间: 2015-2-6 23:53
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
作者: 灵魂腐蚀    时间: 2015-2-19 07:13
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 愤怒的大鸟    时间: 2015-3-6 14:11
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
作者: 小女巫    时间: 2015-3-13 02:10
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
作者: 金色的骷髅    时间: 2015-3-20 10:28
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2