MFC下的常用字符串数据类型表示的含义:

L:Long  长  P:Point  指针  C:Const  常量  W:Wchar_t  宽字符  T:TCHAR   STR:String  字符串

在看看MFC下各种数据类型的定义:

    typedef char *LPSTR;typedef const char *LPCSTR;typedef wchar_t *LPWSTR; typedef const wchar_t *LPCWSTR; typedef wchar_t WCHAR;#ifdef  UNICODE typedef LPCWSTR  LPCTSTR;typedef WCHAR TCHAR;#elsetypedef LPCSTR LPCTSTR;typedef char TCHAR;

MFC下提供的ATL 转换宏:

T2A  T2W  T2CA T2CW         W2A  W2CA W2T  W2CT         A2W  A2CW A2T  A2CT

T:TCHAR  2:To  C:CONST  A:CHAR(ANSI)  W:WCHAR

先到atlconv.h头文件下看看这些宏的定义,

1.USES_CONVERSION:注意int _convert; (_convert);这种用法是为了屏蔽编译器的警告:未引用的局部变量。。。

#ifndef _DEBUG
#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
#else
#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
#endif

可见,USES_CONVERSION宏定义了一些转换所需要的变量,如_convert。所以使用那些宏的时候必须加上该宏。

2.A2W:这里就用到了USES_CONVERSION宏定义的_convert变量

#define A2W(lpa) (\((_lpa = lpa) == NULL) ? NULL : (\_convert = (lstrlenA(_lpa)+1),\(INT_MAX/2<_convert)? NULL :  \ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))

3.ATLA2WHELPER

#define ATLA2WHELPER AtlA2WHelper

4.AtlA2WHelper:实际上还是在调用MultiByteToWideChar,即多字节转换为宽字节

_Ret_opt_z_cap_(nChars) inline LPWSTR WINAPI AtlA2WHelper(_Out_z_cap_(nChars) LPWSTR lpw, _In_z_ LPCSTR lpa, _In_ int nChars, _In_ UINT acp) throw(){ATLASSERT(lpa != NULL);ATLASSERT(lpw != NULL);if (lpw == NULL || lpa == NULL)return NULL;*lpw = '\0';int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);if(ret == 0){ATLASSERT(FALSE);return NULL;}  return lpw;}

5.alloca

#define alloca  _alloca

6._alloca:该函数从堆上分配以字节为单位的内存,返回void *

void *_alloca( size_t size );

使用方法举例:

USES_CONVERSION;//USES_CONVERSION是ATL中的一个宏定义,用于编码转换,它定义了转换宏所需的一些局部变量
WCHAR *pWch = L"WCHAR* TO CHAR*";CHAR *pCh = W2A(pWch);TCHAR *pTch = _T("TCHAR* TO CHAR*");CHAR *pCh2 = T2A(pTch);

使用USES_CONVERSION一定要小心,它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。如果在一个循环中,这个宏被反复调用几万次,将不可避免的产生stackoverflow。

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

  参见http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html

5、将字符转换封装到函数里面

void DoA2W()
{USES_CONVERSION;DoSomething(A2W("SomeString"));
}

除此之外,还可以使用C语言<stdlib.h>提供的函数:

char * pstr = "abc";size_t nLen = _mbstrlen(pstr) + 1;//也可以用mbstowcs(NULL, pstr, 0);,第一个和第三个参数为空即得到非空字符的长度
    wchar_t * pwstr = new wchar_t[nLen];mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string
size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)char *pstr2 = new char[nwLen];wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string
delete []pwstr;pwstr = NULL;delete []pstr2;pstr2 = NULL;

原文地址:http://www.cnblogs.com/wind-net/archive/2012/10/31/2746995.html

【转】MFC 各类型相互转换相关推荐

  1. QString和string类型相互转换

    转自:http://blog.csdn.net/yang_hui1986527/article/details/5273805 在使用QT和C++进行开发的时候,由于两者的数据类型不完全相同,需要进行 ...

  2. 如何使用MFC和类型库创建自动化项目

    摘要 本文详细介绍了如何自动化像Microsoft Office这样支持COM的应用程序. 更多信息 下面部分介绍了如何创建MFC项目.采用Microsoft Excel举例,你可以将前8个步骤用于任 ...

  3. 图像识别模型中图片标注文件的txt和xml类型相互转换

    图像识别学习记录 一.TXT to XML 二.XML to TXT 最近学习图像识别在训练模型时需要将不同模型需要的标注格式来回批量转换,本文介绍了2种方法可以将XML和TXT标注信息相互转换. 网 ...

  4. Swift HandyJSON库中的类型相互转换的实现

    前言 阅读优秀的开源框架,对提升自己的能力有很大帮助.HandyJSON库就是其中的优秀框架之一, 本文介绍一下HandyJSON库是如何处理类型间相互转换的. 我们在开发时,常见的类型转换如下: D ...

  5. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...

  6. C# string类型和byte[]类型相互转换

    string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转成string: ...

  7. golang string转int8_golang 中string和int类型相互转换

    Notepad++ 默认快捷键 Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有 ...

  8. byte数组转blob类型_Java类型相互转换byte[]类型,blob类型

    在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...

  9. C++ string与vectorfloat类型相互转换之stringstream

    1.stringstream类型转换用法 streamstring在调用str()时,会返回临时的string对象.而因为是临时的对象,所以它在整个表达式结束后将会被析构. 如果需要进一步操作stri ...

最新文章

  1. Java Web之XML基础
  2. 再议.Net中null的使用规范
  3. 【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9
  4. redis持久化存储AOF与RDB
  5. php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码
  6. 《Genesis-3D游戏引擎系列教程-入门篇》九:发布到移动平台
  7. 防抖与节流方案_关于图片懒加载的几种方案
  8. ASP.NET事件回传机制
  9. 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP
  10. 测试用例设计-颗粒度
  11. uniapp 发布h5后报错,连接服务器超时,点击屏幕重试
  12. LFY-SpringBoot1【课程概述、springboot2概述】
  13. Python get-pip.py文件
  14. 使用计算机制作数字文本格式,电脑excel表格如何将文本格式变成数字格式
  15. C编译错误,运行错误以及常见问题。
  16. python实现蒙太奇马赛克效果
  17. QDialog设置标题
  18. windows 禁用win任务管理器
  19. usb_modeswitch移植到海思3531D平台(华为E8372h-155)
  20. 做人智慧之低调做人、高调做事

热门文章

  1. python程序员面试宝典 勘误_《前端面试江湖》勘误合集(二)
  2. Android初学第29天
  3. java.io.IOException: Stream closed
  4. 学习Maven之Maven Enforcer Plugin
  5. csdn新版博客初体验
  6. PostgreSQL的HA解决方案-1主从和备份(master/slave and backup)
  7. java幂等性的解决方案
  8. 关于微信小程序开发中遇到的缺少game.json问题的解决
  9. 路由器级联后网速慢的原因分析和问题解决
  10. 一个解决表单中的文字和文本区域(textarea)上对齐的方法