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 字符转换宏相关推荐

  1. A2W和W2A :很好的多字节和宽字节字符串的转换宏

    作者:朱金灿 来源:http://blog.csdn.net/clever101 以前看<Window核心编程>,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideCh ...

  2. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换...

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  3. 用ATL的W2A和A2W宏转换Unicode与ANSI字符串

    1 #include 2 代码如下: 3 4 //使用ATL的W2A和A2W宏必须使用USES_CONVERSION 5 USES_CONVERSION; 6 7 //Unicode字符串 8 wch ...

  4. VC/MFC中常用宏的含义

    VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载)     AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...

  5. 详解MTK系统中字符转换问题

    详解MTK系统中字符转换问题 2011-09-05 19:02 佚名 互联网 字号:T | T MTK系统中字符转换问题是本文要介绍的内容,主要是来了解并学习MTK中一些小案例的应用,具体内容来看本文 ...

  6. html标签转换字符类型,java把html标签字符转换成普通字符(反转换成html标签)

    package net.jasonjiang.web; import org.junit.Test; import org.springframework.web.util.HtmlUtils; /* ...

  7. c语言中用rgb改颜色字体,C语言颜色转换宏

    C语言颜色转换宏 #define COLOR_BPP16_RGB555 /* Win RGB */ #define COLOR_RGB(r,g,b) ((COLORREF)(((BYTE)(r)|(( ...

  8. C语言编码与字符转换

    c语言支持的字符编码 多字节字符编码:用一个字节表示数字.字母,用多个字节表示其它字符(汉字两个字节).字符长度定义:一个字节为一个字符长度. 宽字节字符编码(UNICODE):全部用两个字节表示字符 ...

  9. ATL与MFC消息分发机制的对比---由金山开源代码引出的思考(一)

    博客已迁移至:http://kulv.sinaapp.com/,这里不再使用 ATL与MFC消息分发机制的对比---由金山开源代码引出的思考 (一) 前几天刚看金山开源代码时写了一篇博客分析了一下其消 ...

最新文章

  1. bpython ipython_安装ipython后命令找不到ipython bpython -bash: *python: command not found
  2. 学python要多少钱-python学习费用多少合适
  3. jBPM4.4:分配任务的几种方式
  4. mysql 5.0 php_PHP 5.0的新特性
  5. 如何通俗理解beta分布?
  6. 02-C#入门(枚举、结构等)
  7. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
  8. 深度学习(四十六)——StarGAN, InfoGAN, ProGAN, StyleGAN, BigGAN, FUNIT, CVAE
  9. 【20220912】电商业务的核心流程
  10. vscdoe常用快捷键
  11. 阿里云ACE 架构师 认证指南
  12. windows10搭建DVWA靶场(新手向)
  13. 各个版本的金蝶kis的区别
  14. 企业邮箱怎样申请注册?
  15. 湖南人与江西人,关系有多密切?回顾四省填湘的历史
  16. 网络系统高可用是几个9?
  17. twitter全自动发推_如何阻止Twitter视频自动播放
  18. SQL-44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。...
  19. STM32 启动代码分析
  20. 智慧发电厂+智能发电厂web端平台管理系统+Axure高保真智慧电厂系统+能耗管理+告警管理+生产监控+安防设备管理+运维设备管理+监控面板+系统管理+智慧电厂+电厂系统+智慧电厂管理平台+rp原型

热门文章

  1. CSS 实现 0.5px 边框线
  2. shell切割日志脚本
  3. 当我们在聊监控,我们在聊什么?
  4. Yii2系列教程三:Database And Gii
  5. poj3206(bfs+最小生成树)
  6. 崽崽的发烧终于快结束了
  7. java 监听写文件的进度_java读取文件显示进度条的实现方法
  8. c 子类对象 访问父类对象受保护成员_C++日志(三十四)子类同名成员与作用域分辨符...
  9. 4位先行进位加法器_行波进位/超前进位加法器详解
  10. 查询显示注释_SQL汇总--简单查询