剖析ATL、WTL CString的实现

WTL在Windows CE与Mobile嵌入式开发中的实战价值 WTL(Windows Template Library)是一种基于ATL的轻量级C++ GUI框架,其核心原理是通过CRTP模板模式实现零虚函数、零运行时开销的窗口抽象,避免MFC的内存膨胀与消息映射性能损耗。在资源严苛的嵌入式场景中,WTL凭借静态链接、无DLL依赖、极小二进制体积(典型EXE仅180–240KB)和对WinCE/GWES子系统的深度适配,成为工业HMI、手持终端等长生命周期设备的关键UI方案。它支撑-20℃~60℃宽温运行、4MB堆限制、GDI句柄硬约束及实时响应(<150ms)等刚性 阅读详情

原文地址:http://www.cnblogs.com/tekkaman/archive/2011/04/20/2022570.html


话说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,由此可得出下图:

 

【atlsimpstr.h 都干了什么】

  1、定义了 CStringData 和 CNilStringData 类(前篇已述,此处略)

  2、定义了 ChTraitsBase 类,类如下:

     

  此类比较简单,功能是为不同的字符类型,建立新的统一的名称。另外,这里使用到了模板特化技术。

     3、定义了CSimpleStringT类,此类的功能是,在ChTraitBase定义的统一名称的基础上,提供字符串一些基本的操作功能函数。

  

      t_bMFCDLL可无视。另外,注意,此处所操作的字符串对象,都是CStringData(前篇已述)

  总述:在atlsimpstr.h中,我们发现了3个令人感兴趣的东西,CStringData 是字符串操作单元,ChTraitBase提供字符串变量统一命名服务,而CSimpStringT是一个基于CStringData字符串操作单元的简易的CString(注意,只是简易,其中并未提供我们常用的CString中的那些函数)。

【cstringt.h 都干了什么】

  1、定义了 ChTraitsCRT 类,如下:

  

  该类继承atlsimpstr.h中的 ChTraitsBase 类,然后在父类提供服务的基础上,提供一系列字符串底层操作函数。思考:为什么此处用继承?而CSimpleStringT使用提typedef?

  2、定义了 _MFCDLLTraitsCheck 类,如下:

  

   这里再一次用到了模板特化技术,该类用于检测当前使用的StringTraits是ATL定义的还是MFC定义的。(ATL定义的叫StrTraitATL,MFC定义的叫StrTraitMFC,后面会提到)

  3、定义了 CStringT 类,如下:

  

   注意了,CStringT 就是CString的真身!前面说到,CSimpStringT操作CStringData字符串操作单元,提供基本的字符串操作功能,而CStringT继承CSimpleStringT,利用StringTraits,包装更高级的功能函数。而这些更高级的功能函数,就是我们通常调用CString时所使用到的那些函数。

【atlstr.h 都干了什么】

  1、定义了 CAtlStringMgr 类。(前文已述)

  2、定义了 ChTraitsOS 类,如下:

  

  和 ChTraitCRT相对应,ChTraitsOS继承atlsimpstr.h中的 ChTraitsBase 类,然后在父类提供服务的基础上,提供一系列字符串底层操作函数。

      和 ChTraitCRT相比,他俩提供的函数大部相关,少数不同,另外相同函数名的实现不一定相同。

  3、定义了 StrTraitATL 类,如下:

  

  和 StrTraitMFC相对应,该类提供字符串资源管理函数和CStringData内存管理器的ATL版。

  4、定义了CSTRING,如下:

  

【afxstr.h 都干了什么】

  1、定义了 StrTraitMFC,如下:

  

  上文已述,和StrTraitATL相对,本类提供的功能实现都封闭在MFC中。

  2、定义了CString,如下:

  

【atlmisc.h 都干了什么】

  打开atlmisc.h,可以发现此文件只不过是定义了一些结构体,定义了一个CString的简易版。因为ATL CString依赖于MFC头文件,所以,如果在使用CSTRING而又不想加入过多其它文件时,WTL CSTRING提供了一个很好的选择。

  所有文件都分析后,我们发现,atl、mfc、wtl分别定义了一个CString。其中atl和mfc中的CString都是基于CStringT,只有一个地方是不同的,即CStringT所引用的StringTrait(即StrTraitsATL 还是 StrTraitMFC)。而WTL CString 的实现是独立的,是一个真正的类。另外 ,StringTrait引用的Iterator是可选的(即底层字符串操作封装)。

  最后,我们发现ATL和MFC中涉及CString的类关系有些复杂,我希望画一个图来更好的描述各个类间的相互关系,这个图将放在下一篇随笔……

CCF编程培训师资认证(PTA)标准(教学能力T) 随着计算机科学的不断发展,计算机相关技术应用到社会各个行业,越来越多的青少年参加到了计算机程序设计的学习中,这对编程培训教师提出了更高的专业要求和职业要求。CCF开展编程培训师资认证项目(Programming Trainer Accreditation,PTA),旨在建立一个规范的、科学的、权威且有公信力的三方认证。认证考试分编程专业能力(P)和教学能力(T)两部分。本标准根据《CCF编程培训师资认证条例》第十条制定,旨在明确教学能力(T)的测试标准。 阅读详情

相关推荐

能量机关 STM32HAL库开发大疆A板WS2812B彩灯(PWM+DMA)

本文主要目的是为了制作RoboMaster比赛能量机关的灯条控制,模拟比赛场中大符,搭建出类似场地道具,以供视觉测试 使用的是RoboMaster开发板A型,芯片为STM32F427IIH6,使用的灯条为WS2812B。 采用PWM+DMA控制,使用CUBEMX配置底层,keil5编辑烧录代码 实现:一共五片扇叶,每片扇叶均实现流水灯+常亮颜色 参考文章在后面会标记出来

m0_51756449的博客 4292

深入解析MFC -- CString的内存结构

转自:http://dryfish118.spaces.live.com/Blog/cns!FDCABF8EDB1731D0!660.entry     VC6的时候记得看过CString的源代码,并不复杂,应该是从VC7开始,MFC和ATL共用一个CString了,新的CString使用了模板技术和其它技术,值得一提。        先 看CString的定义:typedef CAtlS

zhoubl668的专栏:远帆,梦之帆! 4557

Verilog与综合:数字逻辑的代码化革命及其未来挑战

本文深入探讨Verilog硬件描述语言与逻辑综合技术在数字芯片设计中的革命性作用。Verilog实现了数字逻辑的代码化描述,而综合技术则将其自动转换为门级网表,大幅提升设计效率。文章重点分析了在先进工艺节点下面临的时序、功耗和物理效应等挑战,并展望了AI驱动综合优化的未来发展方向。

postgres8guard的博客 802

CString 使用笔记

1.RerversseFind(char c)CAtlString s( "abcabc" );_ASSERT( s.ReverseFind( b ) == 4 );2,left(int nCount)CAtlString s( _T("abcdef") );_ASSERT( s.Left(2) == _T("ab") );3. 

newlearner070311的专栏 365

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3310

离合器KP点自学习:从原理到工程实践的全景解析

本文全面解析了离合器KP点自学习的原理与工程实践,详细介绍了KP点的物理本质、控制价值及自学习方法。通过扭矩增量式和转速变化式学习法,结合不同变速箱构型的适配策略,提升离合器控制的精度与效率。文章还探讨了液压系统迟滞补偿和摩擦材料老化应对方案,为工程实践提供可靠保障。

weixin_33717117的博客 287

ATL::CStringT与std::basic_string

我们再来看看神奇的CString,前面其实也提到过的,在Visual C++中,CString实际上是对模板类CStringT的一个特化版本,TCHAR 是个变色龙,因此CString也是一个变色龙:typedef CStringTTCHAR, StrTraitMFCTCHAR > > CString; CStringT继承于CSimpleStringT模板类,它们之间的继承关系如图4-1

黑色星辰 4866

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

923

CString头文件怎么用?

在非MFC工程中.就包含atlstr.h 在MFC工程中.就包含afx.h-

lizfs_csdn的博客 4374

《ATF(TF-A)专题精讲》目录——146篇,完整覆盖整个ATF的官方文档

本文摘要介绍了Trusted Firmware-A (TF-A)项目的技术文档体系。主要内容包括:项目概述、组件解析(如ARM RAS/RME/CCA等安全技术)、系统设计(启动流程、中断管理、信任链等)、开发指南(构建环境、移植策略)、性能分析、平台支持(涵盖NXP、Marvell、Xilinx等主流芯片厂商)、开发流程规范以及安全通告(CVE漏洞分析)。文档体系全面覆盖了ARM安全固件的技术实现、硬件适配和开发实践,为开发者提供了从理论到实践的完整参考。

Linux内核架构师 1115

C/C++炫酷烟花①(完整代码)

C/C++实现炫酷烟花动画的完整代码。

AIGC 2万+

CString使用(多线程、线程安全)

CString的线程安全问题 在多线程中使用一个局部CString变量相加时发现相加的结果是后一个字符串值,没有时间过多研究,只好改成了char*,不过如下方法也可以避免: CWin32Heap stringHeap( HEAP_NO_SERIALIZE, 0, 0 ); CAtlStringMgr stringMgr( &stringHeap ); CString strstate(&s

优快云CShuan的博客 2989

Redhawk:toggle rate从哪来?

redhwak中toggle rate的相关设置

m0_61544122的博客 8127

[转]剖析ATL、WTL CString的实现

源于http://hi.baidu.com/xiaoyaoyiyiyun/blog/item/c6d102fa3989e9344f4aea86.html 话说CString这个东西困扰了很多年轻人,因为它会引起诡异的编译错误,今天跟着我一起来深入ATL、WTL头文件,来把这个东西搞个清清楚楚。 【涉及到头文件】   ATL: atlstr.h, atlsimpstr.h   MFC : ...

weixin_30825199的博客 334

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【转】剖析ATL\WTL\CSTRING的实现

原文地址:http://www.cnblogs.com/tekkaman/archive/2011/04/20/2022570.html 话说CString这个东西困扰了很多年轻人,因为它会引起诡异的编译错误,今天跟着我一起来深入ATL、WTL头文件,来把这个东西搞个清清楚楚。 【涉及到头文件】   ATL : atlstr.h, atlsimpstr.h

月球人的专栏 1478

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ATL、MFC、WTL CString 的今生前世

话说CString这个东西困扰了很多年轻人,因为它会引起诡异的编译错误,今天跟着我一起来深入ATL、WTL头文件,来把这个东西搞个清清楚楚。 【涉及到头文件】   ATL: atlstr.h, atlsimpstr.h   MFC : cstringt.h、afxstr.h   WTL : atlmisc.h   ATL和MFC有关剪不断理还乱的...

Chinamming的专栏 286

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC++经典项目解析:从Windows底层到现代C++的工程实践

C++作为系统级编程语言,其核心价值在于对硬件资源的直接控制和高性能计算能力。在Windows平台上,Visual C++(VC++)生态通过MFC、ATL、COM等技术栈,构建了桌面应用和系统工具的底层框架。理解消息循环、内存管理、进程通信等原理,不仅能掌握Windows系统的工作机制,更能提升大型软件工程的架构设计能力。通过剖析经典项目中的设计模式、性能优化技巧和调试方法论,开发者可以汲取超越特定工具的编程思想,将其应用于现代C++开发中。本文以**MFC消息映射**和**Winsock网络编程**为例

weixin_33769125的博客 377

ATL使用CString类笔记

ATL中使用CString时,会提示说使用WTL::CString,(由于WTL也有CString,但却不受官方支持,最好使 用ATL的实现)而我们只需要使用ATL::CString就可以了,这时只需要在stdafx.h头文件中加如下面2句即可: //注明使用ATL::CString而不是WTL::CString#define _WTL_NO_CSTRING#include &...

dianhao0777的博客 241

ATL CString 的代码 整理

从ATL整理的CString代码 可以用于其他项目 #pragma once #include &lt;assert.h&gt; #include &lt;mbstring.h&gt; #include &lt;atlexcept.h&gt; #define IN_OPT #define IN_OUT #ifndef MYATLENSURE_RETURN_VAL #define MYAT...

lif12345的专栏 2245

MFC常用字符编码转换

MFC中几种字符串

LDL 2903

ATL CString

将网络上关于ATL的CString用法整理了一下ATL中使用CString时,会提示说使用WTL::CString,(由于WTL也有CString,但却不受官方支持,最好使用ATL的实现)而我们只需要使用ATL::CString就可以了,这时只需要在stdafx.h头文件中加如下面2句即可: //注明使用ATL::CString而不是WTL::CString #define _WTL_NO_CSTRING #include 如果还有有问题,放到#include 前试试。来源 http://blog.sina

lily_86的专栏 3727

string头文件与cstring头文件

首先说string的头文件 1、 包装了std的C++头文件 2、 旧的C头文件 3、 旧C头文件的std版本,切记,这不是cstring的头文件

enjolras的专栏 1万+

没有与参数列表匹配的 重载函数 “ATL::CStringT<BaseType, StringTraits>::Format问题

CString sTmp; sTmp.Format(_T("%d"),nTimer++); CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME); pWnd->SetWindowText(sTmp); 运行完报错: 没有与参数列表匹配的 重载函数 “ATL::CStringT<BaseType, StringTraits>::Format [其中 BaseType=wchar_t, StringTraits=StrTraitMFC_DLL<.

qq_35020156的博客 1594

介绍ATL CString

介绍ATL CString 1.CString::IsEmpty BOOL IsEmpty( ) const; 返回值:如果CString 对象的长度为0,则返回非零值;否则返回0。 说明:此成员函数用来测试一个CString 对象是否是空的。 示例: 下面的例子说明了如何使用CString::IsEmpty。 // CString::IsEmpty 示例 CString s

物知馆 2773

error C2664: “void ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UIN

rror C2664: “void ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UINT,…)”: 无法将参数 1 从“const char [36]”转换为“const wchar_t *” 报错原因 还有一点需要读者注意的是,宽字符不等于Unicode,Unicode 是宽字符编码的一种,只不过最常见的宽字符编码方式就是Unicode了,UTF-16和UTF

TrueLink的博客 4296
上一篇: D3DX数学库函数备份
下一篇: WTL的CFileDialog对话框使用
RabbitLBJ
博客等级 码龄18年 46粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值