ATL字符串转换宏

2023-11-20

有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?

头文件
d:/program files/microsoft visual studio 8/vc/atlmfc/include/atlconv.h

如果要使用ATL字符串转换宏,请先定义
USES_CONVERSION;  // 只需要调用一次,就可以在函数中进行多次转换

下面一个例子:
    USES_CONVERSION;  // 只需要调用一次,就可以在函数中进行多次转换
    char a[12] = "china";
    ::MessageBoxW( NULL, A2W(a), L"", MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

使用 ATL 提供的转换宏
 

A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

上表中的宏函数,其实非常容易记忆:
2 好搞笑的缩写,to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
A ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
C const 的缩写

ATL3.0 的字符串转换宏

ATL3.0中常用的字符串转换宏无非是 A2W , W2A , A2T , T2A , A2OLE 等,当然在使用这些宏之前(函数开始处)必须使用USES_CONVERSION 宏。这些宏很大程度上方便了宽字符串与多字节字符串间的转换,但是在使用这些时有一些限制。其中非常重要的一点是,这些宏不宜在循环中使用。 ATL7.0 中的字符串转换 类 和 宏 则很好地避免了这些问题。

ATL7.0 中新的字符串转换 类和宏

ATL7.0 中新的字符串转换 宏 主要有 CA2W , CW2A , CW2T, CA2T ,  CA2OLE 等。这些宏都是基于CA2WEX 和CW2AEX这两个模板类,同时在进行字符串转换时还可以指定字符串转换时所使用的code page,例如:

[cpp]  view plain copy
  1. // Specifying the code page.  
  2. void ExampleFunctionW( LPCWSTR pszW )  
  3. {   
  4. // Convert to the utf-8 code page     
  5.     ExampleFunctionA( CW2A( pszW, CP_UTF8 ) );  
  6. }  


 

与之前的字符串转换宏相比,两者有如下不同

ATL 3.0 字符串转换宏 ATL7.0 字符串转换类
在栈上分配内存 对于短字符串使用栈上的内存,如果内存不够使用堆内存
在函数退出时字符串占用的内存被释放 当变量超出作用域后内存被释放
不能在异常处理代码中使用 可以在异常处理代码中使用
不适用于循环,内存会一直增长直到函数退出 可以在循环中使用,每次迭代分配的内存都会被释放
不适用于太长的字符串,栈内存是有限的 可以处理长字符串,在堆中分配内存
通常需要定义 USES_CONVERSION 不需要定义USES_CONVERSION
OLE的含义取决于OLE2ANSI的定义

OLE 等同于W

 从上面的对比可以看出ATL7.0 中新的字符串转换 类/宏 相比于旧的字符串转换宏有很大的改进。

在使用新的字符串转换宏时需要注意下面的问题

在使用ATL 3.0 的宏时,可能会有下面的代码

[cpp]  view plain copy
  1. LPCTSTR szr = A2T( szReplaceFile );  

上面的代码是正确的,而在ATL7.0 中类似的

[cpp]  view plain copy
  1. LPCTSTR szr = CA2T( szReplaceFile );  

一般来说却是错误的,如果在后面的代码中使用 szr 时,szr所指向的内存已经被销毁,因为 CA2T的实例已经超出作用域

 

 

参考:http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.100).aspx  (ATL and MFC String Conversion Macros)


http://blog.csdn.net/earbao/article/details/11696929


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ATL字符串转换宏 的相关文章

  • BUUCTF [极客大挑战 2019] Http

    BUUCTF 极客大挑战 2019 Http 启动环境 主页为三叶草技术小组纳新 查看网页源码 发现隐藏的页面 div class image img src images pic01 jpg alt div div class conte

随机推荐

  • HTML--后台管理系统

    后台管理系统
  • [网络安全自学篇] 八十七.恶意代码检测技术详解及总结

    这是作者网络安全自学教程系列 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您喜欢 一起进步 前文分享了威胁情报分析 通过Python抓取FreeBuf网站 APT 主题的相关文章 这篇文章将详细总结恶意代码检测技术
  • 【SpringMVC】参数传递与用户请求和响应

    目录 一 Postman 工具使用 1 1 Postman安装 1 2 Postman的使用 1 2 1 创建WorkSpace工作空间 1 2 2 创建请求 二 参数传递 2 1 添加 Slf4j 依赖 2 2 普通传参 知识点1 Req
  • js formatDate 时间转换

    formatDate function time fmt type type 类型 0 时间为秒 1 时间为毫秒 var date new Date type 0 time 1000 time var o M date getMonth 1
  • ltconfig: you must&nbs…

    在64位机器下编译libghttp碰到的问题 libghttp是gnome下的HTTP客户端库 实现http功能 可以替换curl 的http功能 在32位的机器上编译没问题 在64位的机器上 configure 不过去 错误信息是 ltc
  • vue+C#后台上传excel处理数据

    比较简洁的excel处理方法 希望对大家有所帮助 1 界面
  • POJ - 2325 Persistent Numbers

    The multiplicative persistence of a number is defined by Neil Sloane Neil J A Sloane in The Persistence of a Number publ
  • angular:ng add “@nguniversal/express-engine“提示Data path ““ must NOT have additional properties

    出现原因 未知 只知道有个项目能成功 拷贝这个项目uninstall后再次ng add也能成功 而其他项目无法成功 提示这个 解决办法 手动添加相关代码 一样能够运行 ssr
  • 《零基础入门学习Python》第061讲:论一只爬虫的自我修养9:异常处理

    高级语言的一个有些特性就是它可以从容不迫的处理每一个遇到的错误 不至于说遇到一个小错误就导致整个程序崩溃了 大部分高级语言处理错误的方法都是通过检测异常 处理异常来实现的 Python也是一样 用程序用代码进行互联网访问的时候 会出现异常是
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 图数据库中的空间值——实现图数据库内容在地理坐标系下展现

    一个帅气的boy 你可以叫我Love And Program 个人主页 Love And Program的个人主页 如果对你有帮助的话希望三连 支持一下博主 坐标参考系统 地理坐标系及地图经纬度拾取 笛卡尔坐标系 在这里插入图片描述 图数据
  • dev-c++官网位置和源码/库位置

    1 http devpaks org 2 http www bloodshed net 3 http www bloodshed net dev 转载于 https www cnblogs com vilyLei articles 1812
  • 亲爱的波特兰——CJ麦科勒姆告别信

    系列文章目录 精选优美英文短文1 Dear Basketball 亲爱的篮球 精选优美英文短文2 Here s to the Crazy Ones 致疯狂的人 我祝你不幸并痛苦 约翰 罗伯茨毕业致辞 Dear Portland You kn
  • 数据库学习笔记(9)——python连接数据库/python操作数据库/sql注入

    1 python连接数据库 1 不管是那一门编程语言都是不可以直接连接数据库的 需要有连接介质 连接池 2 python的连接池有 pymysql 或者 mysqlclient 3 在cmd中导入库 pip install pymysql
  • java文件上传

    简介 java文件上传 1 Commons FileUpload简介 1 Commons FileUpload组件 Commons是Apache开放源代码组织的一个Java子项目 其中的FileUpload是用来处理HTTP文件上传的子项目
  • C++类大小计算

    关于C 类大小计算 这在一本书 深度探索C 对象模型 一书中有非常详细的介绍 我这里归纳整理 本节讨论的是64位地址计算机 指针长度8字节 1 类的大小取决于以下成员 a 非静态成员变量 b 虚函数table c 数据对齐 d 空类 当然还
  • linux下makefile的CC和gcc

    参考自 http www cnblogs com zhouyinhui archive 2010 02 01 1661078 html CC gcc CC arm hisiv400 linux gcc 上面是经常遇到的makefile中编写
  • 阿兰·麦席森·图灵 介绍

    Alan MAthison Turing 英国数学家 逻辑学家 被称为 计算机科学之父 人工智能之父 她曾协助盟军破解德国的著名密码系统Enigma 帮助盟军取得了第二次世界大战的胜利 他对计算机的贡献在于他提出的有限状态自动机也就是图灵机
  • 微信支付商家转账到零钱功能使用教程

    之前的 企业付款到零钱 功能 微信支付已下架 以后用 商家转账到零钱 功能取代 下面介绍如何开通并使用该功能 从运营账户支出 首先需要先去了解一下微信支付的这3个账户的关系 商家转账到零钱 功能 是从运营账户转账给用户的 开通 商家转账到零
  • ATL字符串转换宏

    有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏 你相信吗 头文件 d program files microsoft visual studio 8 vc atlmfc include