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; #else
typedef 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)+),\
(INT_MAX/<_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, , lpa, -, lpw, nChars);
if(ret == )
{
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) + ;
//也可以用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) + ;//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. mysql关联修改SQL及long与datetime类型相互转换

    1.关联修改 #解决思路 UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name UPDATE car c,tmpcolo ...

  2. Java之byte、char和String类型相互转换

    package basictype; /** * byte.char和String类型相互转换 */ public class CHJavaType { public static void main ...

  3. C#枚举类型和int类型相互转换

    C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...

  4. [转]如何使用MFC和类型库创建自动化项目

    本文转自:http://www.cnblogs.com/zhoug2020/archive/2012/04/01/2429064.html 摘要 本文详细介绍了如何自动化像Microsoft Offi ...

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

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

  6. Java类型相互转换byte[]类型,blob类型

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

  7. QT枚举类型与字符串类型相互转换

    在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...

  8. 常用js类型相互转换

    数字转换为字符串 var a=200.21;document.write(a.toString(10));  结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...

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

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

随机推荐

  1. Spring注解运行时抛出null

    关于Spring的注解其实不难,大致需要以下几个流程: 一.配置Spring的注解支持 <?xml version="1.0" encoding="UTF-8&qu ...

  2. NET使用NPOI组件将数据导出Excel-通用方法 【推荐】

    一.Excel导入及导出问题产生:   从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:   导出问题:   如果是as ...

  3. mac eclipse 执行adb 命令,提示command not fount

    java执行命令: p = Runtime.getRuntime().exec(commandStr); [INFO ] 执行命令结果:nullbash: adb: command not found ...

  4. 使用R语言分析股价波动

    今天看的R语言.做个笔记. 使用R语言读取雅虎財经数据.分析微软公司(股票代码:MSFT)在2015年股价波动超过百分之十的日期. 然后通过检索新闻的方式,看看微软当天有什么新闻发生,导致股价波动. ...

  5. Bash Shell中Shift用法分享

    这篇文章主要介绍了Bash Shell中Shift的使用方法,需要的朋友可以参考下 shift可以用来向左移动位置参数.Shell的名字 $0第一个参数 $1第二个参数 $2第n个参数 $n所有参数 ...

  6. Linux下查看Raid磁盘阵列信息的方法

    Linux下查看软.硬raid信息的方法. 软件raid:只能通过Linux系统本身来查看 cat /proc/mdstat 可以看到raid级别,状态等信息. 硬件raid: 最佳的办法是通过已安装 ...

  7. 字符编码:ASCII,Unicode,UTF-8

    1.ASCII码美国制定的一套字符编码,对英语字符和二进制位之间的关系,做了统一规定.ASCII码一共规定了128个字符(包括32个不能打印出来的控制符号)的编码,占用一个字节,字节的最前面1位统一为 ...

  8. Freemarker-2.3.22 Demo - No01_获取模板并直接输出

    package No01_获取模板并直接输出; import java.io.File; import java.io.FileOutputStream; import java.io.OutputS ...

  9. 关于Solr6.0中solrj使用简单例子

    solr6.0的solrJ接口有部分变化,下面列出了简单的使用实例,有需要的朋友可以参考下. package com.ailk.solr6; import java.io.IOException; i ...

  10. 经典 makefile 教程

     makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序 ...