【转】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;#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 各类型相互转换相关推荐
- QString和string类型相互转换
转自:http://blog.csdn.net/yang_hui1986527/article/details/5273805 在使用QT和C++进行开发的时候,由于两者的数据类型不完全相同,需要进行 ...
- 如何使用MFC和类型库创建自动化项目
摘要 本文详细介绍了如何自动化像Microsoft Office这样支持COM的应用程序. 更多信息 下面部分介绍了如何创建MFC项目.采用Microsoft Excel举例,你可以将前8个步骤用于任 ...
- 图像识别模型中图片标注文件的txt和xml类型相互转换
图像识别学习记录 一.TXT to XML 二.XML to TXT 最近学习图像识别在训练模型时需要将不同模型需要的标注格式来回批量转换,本文介绍了2种方法可以将XML和TXT标注信息相互转换. 网 ...
- Swift HandyJSON库中的类型相互转换的实现
前言 阅读优秀的开源框架,对提升自己的能力有很大帮助.HandyJSON库就是其中的优秀框架之一, 本文介绍一下HandyJSON库是如何处理类型间相互转换的. 我们在开发时,常见的类型转换如下: D ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...
- C# string类型和byte[]类型相互转换
string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转成string: ...
- golang string转int8_golang 中string和int类型相互转换
Notepad++ 默认快捷键 Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有 ...
- byte数组转blob类型_Java类型相互转换byte[]类型,blob类型
在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们 ...
- C++ string与vectorfloat类型相互转换之stringstream
1.stringstream类型转换用法 streamstring在调用str()时,会返回临时的string对象.而因为是临时的对象,所以它在整个表达式结束后将会被析构. 如果需要进一步操作stri ...
最新文章
- Java Web之XML基础
- 再议.Net中null的使用规范
- 【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9
- redis持久化存储AOF与RDB
- php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码
- 《Genesis-3D游戏引擎系列教程-入门篇》九:发布到移动平台
- 防抖与节流方案_关于图片懒加载的几种方案
- ASP.NET事件回传机制
- 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP
- 测试用例设计-颗粒度
- uniapp 发布h5后报错,连接服务器超时,点击屏幕重试
- LFY-SpringBoot1【课程概述、springboot2概述】
- Python get-pip.py文件
- 使用计算机制作数字文本格式,电脑excel表格如何将文本格式变成数字格式
- C编译错误,运行错误以及常见问题。
- python实现蒙太奇马赛克效果
- QDialog设置标题
- windows 禁用win任务管理器
- usb_modeswitch移植到海思3531D平台(华为E8372h-155)
- 做人智慧之低调做人、高调做事
热门文章
- python程序员面试宝典 勘误_《前端面试江湖》勘误合集(二)
- Android初学第29天
- java.io.IOException: Stream closed
- 学习Maven之Maven Enforcer Plugin
- csdn新版博客初体验
- PostgreSQL的HA解决方案-1主从和备份(master/slave and backup)
- java幂等性的解决方案
- 关于微信小程序开发中遇到的缺少game.json问题的解决
- 路由器级联后网速慢的原因分析和问题解决
- 一个解决表单中的文字和文本区域(textarea)上对齐的方法