【转】剖析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的类关系有些复杂,我希望画一个图来更好的描述各个类间的相互关系,这个图将放在下一篇随笔……

【校园网代理连接问题】已解决,“该设备或资源(Web 代理)未设置为接受端口“7890”上的连接“ 我遇到这个问题很多次。每次都是vpn的问题,不止通俗意义上的梯子(clash之类的),还包括校园网vpn。点击“ 拨号和虚拟专用网络设置”中的“设置”, 关闭代理服务器。在打开vpn后或者关闭vpn后无法浏览网页,网页诊断显示“关闭“手动设置代理”中的“使用代理服务器”,关闭对应的本地代理即可。 阅读详情

相关推荐

华大HC32F460从零到200MHz:手把手教你配置时钟系统(附避坑指南)

本文详细解析了华大HC32F460 MCU的时钟系统配置,从启动过程、时钟树分析到实战配置200MHz系统时钟。文章手把手指导开发者如何正确配置外部晶振、MPLL锁相环及总线分频,并提供了硬件检查、代码解读及常见问题排查的避坑指南,帮助用户从零构建稳定可靠的高性能时钟环境。

net55的博客 297

剖析ATL、WTL CString的实现

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

968

《华为项目管理之道》第1章笔记

performance indicator,KPI)纳入个人绩效承诺书,贯彻结果导向的理念,以向员工。客户需求是华为发展的原动力,为客户服务是华为存在的唯一理由。目经理‘用兵’,依靠市场机制‘调兵’”,打破了人员在功能部门的板结,实现了听得。为管理者选拔的必要条件,项目经理成为人人向往的岗位。《华为项目管理之道》,是新出的华为官方的项目管理书,整个书不错。伴随着项目型组织的建立,华为逐步形成了完备的项目管理流程和制度,从而将业务运。为此,通过改革,重新明确了项目经理承担的经营责任,并开始以项。

jackyrongvip的专栏 2128

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

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

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

手把手教你用Pico4UE搭建100平米VR大空间:从设备检查、系统升级到地图绘制全流程

本文详细介绍了使用Pico4UE搭建100平米VR大空间的完整流程,包括设备检查、系统升级、地图绘制和性能优化等关键步骤。通过实战案例和专业技术建议,帮助用户高效部署企业级VR解决方案,适用于展厅漫游、工业仿真等多种场景。

weixin_28273593的博客 508

PTrade数据交互全流程详解:从本地文件上传到定时导出交易数据

本文详细解析了PTrade量化交易平台的数据交互全流程,涵盖从本地文件自动上传交易指令到定时导出成交数据的完整链路。通过文件媒介实现本地策略与云端实盘的安全、稳定对接,并提供了构建自动化、稳健数据流水线的实战配置方案与代码示例,助力量化工作流平滑过渡至实盘。

gg901的博客 883

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

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合ollama无限token实现7*24小时工作(附配置)

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合 ollama 无限token实现7*24小时工作,以及部署安装需要的 skills 完成复杂的工作任务(附完整可以运行的配置文件)。 很多人已经会配置安装 openclaw 了 ,但是 安装完成之后真正让电脑自动运行起来的很好,完成出色工作的更少,最常见的就是聊聊天,或者执行一些简单的命令,理解要让电脑自动化工作,openclaw、skills、大模型这三样。

代码讲故事 2963

ATL::CStringT与std::basic_string

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

黑色星辰 4866

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2656

【数字孪生与仿真技术】05:从原理到实战:MATLAB/Simulink在航空航天GNC系统开发中的深度解析(含全流程代码与认证指南)

摘要:本文系统阐述MATLAB/Simulink在航空航天制导、导航与控制(GNC)系统开发中的核心应用。通过解析GNC系统高保真动力学建模、多源导航传感器融合、鲁棒控制算法设计等关键技术原理,结合Virgin Orbit运载火箭、CubeSat等真实案例,展示从需求分析、模型搭建、仿真验证到代码生成与认证的完整开发流程。文中提供1200余行关键代码、8个可复用Simulink模型及详细执行结果展示,涵盖DO-178C认证支持、实时性能优化等工业级开发规范,为航空航天工程师、科研人员提供可落地的参考方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1657

CString头文件怎么用?

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

lizfs_csdn的博客 4374

1、信息与物理世界:“It from Bit”还是“Bit from It”?

这篇博文探讨了物理学与信息理论之间的深刻联系,从惠勒提出的“It from Bit”概念出发,讨论了信息是否是物质世界的基础,或者物质是否是信息的来源。文章回顾了2013年举办的征文竞赛以及众多学者对这一问题的不同观点,涵盖了量子理论、热力学、计算机科学、黑洞物理以及时空本质等多个领域。同时,文章还分析了信息理论在哲学层面的含义,并展望了其在未来理论、实验和应用研究中的潜力与方向。

water的专栏 293

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

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

weixin_33769125的博客 377

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

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

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

优快云CShuan的博客 2989

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

没有与参数列表匹配的重载函数ATL CStringT BaseType, StringTraits Format

标题盛不下,先给出完整的错误: IntelliSense: 没有与参数列表匹配的 重载函数 “ATL::CStringT<BaseType, StringTraits>::Format [其中 BaseType=wchar_t, StringTraits=ATL::StrTraitATL<wchar_t, ATL::ChTraitsCRT<wchar_t>>]”...

derbi123123的博客 2791

typedef ATL::CStringT<...>

书籍:《Visual C++ 2017从入门到精通》的2.7 字符串环境:visual studio 2022内容:GetBuffer()函数以下是对。

felicity_one的博客 924

ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>::CompareNoCase(const char *) c

captionText.CompareNoCase(L"访问文档时出现问题") == 0。

m0_68739984的博客 337
上一篇: WTL\MFC\ATL CSTRING的前世今生
下一篇: 上海一日游
月球人
博客等级 码龄15年 6粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值