ATL 和 MFC 字符转换宏
ATL 和 MFC 字符转换宏
ATL3.0
Ø ATL3.0中的W2T ,T2W等一系列宏很方便,但一定要小心,它们从栈上分配内存,直到调用它的函数返回前,该内存不会被释放,如果在一个循环中,这类宏被你反复调用几万次时,你将不可避免地产生stack overflow 。解决的方法是,将用到该宏的语句独立封装成一个函数,这样就可以无限次调用了。
Ø ATL3.0的主要宏如下:
Ø 使用方法如下.
#include <atlconv.h>
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
}
Ø 这些宏的名字有一它的意义, 被转换的字符在左边(如: A) 转换后的字符在后边(如:W),2表示To ,A是LPSTR字符,, OLE 是LPOLESTR字符, T 是 LPTSTR字符, W 是 LPWSTR字符。如果宏的名字中含有C,表示该宏将会转换成一个Const string,例如, W2CA 将LPWSTR 转换成LPCSTR., A2W 将 LPSTR 转换成 LPWSTR, OLE2T 将LPOLESTR t转换成 LPTSTR……
Ø ATL宏的行为取决于编译器指令生成效果,如果源字符和目的字符类型相同,就不会发生转换动作,编译器在预编译过程中将会将宏名种的T和OLE参照如下表进行转换。
是否存在下列预编译宏 |
|
T 成为 |
OLE成为 |
没有定义 |
A |
W |
|
定义了_UNICODE |
W |
W |
|
定义了OLE2ANSI |
A |
A |
|
定义了_UNICODE 和OLE2ANSI |
W |
A |
ATL7.0
Ø ATL7.0增加了几种新的宏和类,对已有的宏做了很大的该进.
Ø ATL7.0宏名形如如下形式 --- C(源字符类型)2[C](目的字符类型) [EX]
其中:
· 源字符类型和目的字符类型参照下表。
· 如果目的字符类型要求是常量,则需要 [C]。
· 如果需要以参数形式指定目的字符内存初始化大小,则需要[EX]。
源字符类型/目的字符类型 |
说 明 |
A |
ANSI character string. |
W |
Unicode character string. |
T |
Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise). |
OLE |
OLE character string (equivalent to W). |
例如,将一个Unicode string 转换成 普通string 而不改变源string ,可以用CW2CT。如果已经知道转换后的字符不会超过64个字符,可以选择含有EX的宏,并将大小限制以参数形式指定如:CW2CTEX<64>。
Ø ATL7.0新增的转换类: (CA2AEX, CA2WEX, CW2AEX, and CW2WEX) ,他们需要修正的静态存储区来保结果,如果转换后的字符过大,超出了静态存储区内存大小,这些类会自动释放内存,保证了安全性,避免了ATL3.0中宏在循环过程中会将栈占满。7.0对空字符的输入做了处理,如果输入为空字符,返回空,不会分配内存。
Ø 部分代码如下
#define COLE2T CW2T #define COLE2TEX CW2TEX
#define COLE2CT CW2CT #define COLE2CTEX CW2CTEX
#define CT2OLE CT2W #define CT2OLEEX CT2WEX
#define CT2COLE CT2CW #define CT2COLEEX CT2CWEX
class CW2WEX, class CA2AEX
typedef CW2WEX<> CW2W typedef CA2AEX<> CA2A
class CA2CAEX class CW2CWEX
typedef CA2CAEX<> CA2CA typedef CW2CWEX<> CW2CW
class CA2WEX class CW2AEX
typedef CA2WEX<> CA2W typedef CW2AEX<> CW2A
Ø ATL3.0字符转换宏和ATL7.0字符转换宏和转换类的主要区别如下:
ATL 3.0 字符转换宏 |
ATL 7.0字符转换类 |
在栈上分配内存 |
小字符在栈上分配,大字符在堆上分配 |
函数退出后,转换后的字符被释放 |
当超出一定的使用限制时,字符才被释放 |
没有意外情况处理 |
有意外情况处理 |
不适合在循环中使用 |
可以在循环中使用 |
栈空间有限, 不适合大字符 |
字符大小没有限制,可以在堆上分配内存 |
需要定义USES_CONVERSION宏 |
不需要定义USES_CONVERSION宏 |
OLE的类型取决于OLE2ANSI宏的定义 |
OLE类型总是和 W类型相同 |
ATL 和 MFC 字符转换宏相关推荐
- A2W和W2A :很好的多字节和宽字节字符串的转换宏
作者:朱金灿 来源:http://blog.csdn.net/clever101 以前看<Window核心编程>,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideCh ...
- 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 用ATL的W2A和A2W宏转换Unicode与ANSI字符串
1 #include 2 代码如下: 3 4 //使用ATL的W2A和A2W宏必须使用USES_CONVERSION 5 USES_CONVERSION; 6 7 //Unicode字符串 8 wch ...
- VC/MFC中常用宏的含义
VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载) AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...
- 详解MTK系统中字符转换问题
详解MTK系统中字符转换问题 2011-09-05 19:02 佚名 互联网 字号:T | T MTK系统中字符转换问题是本文要介绍的内容,主要是来了解并学习MTK中一些小案例的应用,具体内容来看本文 ...
- html标签转换字符类型,java把html标签字符转换成普通字符(反转换成html标签)
package net.jasonjiang.web; import org.junit.Test; import org.springframework.web.util.HtmlUtils; /* ...
- c语言中用rgb改颜色字体,C语言颜色转换宏
C语言颜色转换宏 #define COLOR_BPP16_RGB555 /* Win RGB */ #define COLOR_RGB(r,g,b) ((COLORREF)(((BYTE)(r)|(( ...
- C语言编码与字符转换
c语言支持的字符编码 多字节字符编码:用一个字节表示数字.字母,用多个字节表示其它字符(汉字两个字节).字符长度定义:一个字节为一个字符长度. 宽字节字符编码(UNICODE):全部用两个字节表示字符 ...
- ATL与MFC消息分发机制的对比---由金山开源代码引出的思考(一)
博客已迁移至:http://kulv.sinaapp.com/,这里不再使用 ATL与MFC消息分发机制的对比---由金山开源代码引出的思考 (一) 前几天刚看金山开源代码时写了一篇博客分析了一下其消 ...
最新文章
- bpython ipython_安装ipython后命令找不到ipython bpython -bash: *python: command not found
- 学python要多少钱-python学习费用多少合适
- jBPM4.4:分配任务的几种方式
- mysql 5.0 php_PHP 5.0的新特性
- 如何通俗理解beta分布?
- 02-C#入门(枚举、结构等)
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
- 深度学习(四十六)——StarGAN, InfoGAN, ProGAN, StyleGAN, BigGAN, FUNIT, CVAE
- 【20220912】电商业务的核心流程
- vscdoe常用快捷键
- 阿里云ACE 架构师 认证指南
- windows10搭建DVWA靶场(新手向)
- 各个版本的金蝶kis的区别
- 企业邮箱怎样申请注册?
- 湖南人与江西人,关系有多密切?回顾四省填湘的历史
- 网络系统高可用是几个9?
- twitter全自动发推_如何阻止Twitter视频自动播放
- SQL-44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。...
- STM32 启动代码分析
- 智慧发电厂+智能发电厂web端平台管理系统+Axure高保真智慧电厂系统+能耗管理+告警管理+生产监控+安防设备管理+运维设备管理+监控面板+系统管理+智慧电厂+电厂系统+智慧电厂管理平台+rp原型
热门文章
- CSS 实现 0.5px 边框线
- shell切割日志脚本
- 当我们在聊监控,我们在聊什么?
- Yii2系列教程三:Database And Gii
- poj3206(bfs+最小生成树)
- 崽崽的发烧终于快结束了
- java 监听写文件的进度_java读取文件显示进度条的实现方法
- c 子类对象 访问父类对象受保护成员_C++日志(三十四)子类同名成员与作用域分辨符...
- 4位先行进位加法器_行波进位/超前进位加法器详解
- 查询显示注释_SQL汇总--简单查询