【转】MFC 各类型相互转换
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 各类型相互转换的更多相关文章
- mysql关联修改SQL及long与datetime类型相互转换
1.关联修改 #解决思路 UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name UPDATE car c,tmpcolo ...
- Java之byte、char和String类型相互转换
package basictype; /** * byte.char和String类型相互转换 */ public class CHJavaType { public static void main ...
- C#枚举类型和int类型相互转换
C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...
- [转]如何使用MFC和类型库创建自动化项目
本文转自:http://www.cnblogs.com/zhoug2020/archive/2012/04/01/2429064.html 摘要 本文详细介绍了如何自动化像Microsoft Offi ...
- C# string类型和byte[]类型相互转换
string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转成string: ...
- Java类型相互转换byte[]类型,blob类型
在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...
- QT枚举类型与字符串类型相互转换
在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...
- 常用js类型相互转换
数字转换为字符串 var a=200.21;document.write(a.toString(10)); 结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string)string转成int64: int64, e ...
随机推荐
- Linux内核中锁机制之完成量、互斥量
在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...
- SSH2框架实现注冊发短信验证码实例
这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...
- tomcat6的编译和导入myeclipse
声明:近期在学习tomcat6的源代码,网上搜索了些相关的资料,并自己操作了下进行了对应的汇总.如今总结例如以下 本文目的:编译tomcat6源代码+导入tomcat6源代码到myeclipse 測试 ...
- Python UNICODE GBK UTF-8 之间相互转换
Python 编码格式检测,可以使用 chardet , 例如: import urllib rawdata = urllib.urlopen('http://www.google.cn/').rea ...
- 【备用】SQL SERVER存储过程执行速度慢的问题
今天看到了但是暂时没有时间研究,先留着备用(Parameter Sniffing) http://blog.csdn.net/emili/article/details/2192081 http:// ...
- 每日英语:Hold On: Reasons For Never Giving Up Your Dream
Do you remember what you wanted to be when you grew up? Maybe a fireman? A baker? A ballerina? You p ...
- IOS7的蛋疼各种收集
------------------ ios7基于viewController隐藏状态条:通过ViewController重载方法返回枚举值的方法来控制状态栏的隐藏和样式.首先,需要在Info.pli ...
- 让input变成不可编辑状态的方法
有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...
- jQuery实现的层级轮播图
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- echarts报错Cannot read property 'features' of undefined
引入地图的时候 echarts2报错: Uncaught Error: [MODULE_MISS]"echarts/src/util/mapData/params" is not ...