(转载) WCHAR与CHAR的转换
Windows API中很多参数是LPTSTR类型的,关于这个LPTSTR很多人都解释过了,没什么好说的
#ifdef UNICODE
typedef LPWSTR LPTSTR
#else
typedef LPSTR LPTSTR
#endif
说白了,就是一个自适应的字符指针,在2005环境下当你调用某个包含 LPTSTR 参数的函数的时候,如果你试图用一个 char* 糊弄,那就会残忍的报错了,怎么办呢,土办法,你不要宽字符吗,好,我转。同理,你不憎恨宽字符吗,我转。
网上能找到很多关于LPSTR与LPTSTR互相转换的帖子,不幸的是都是一个片断,拿过来肯定不能用的。
LPSTR与LPTSTR之间的转换方法有很多,不过我就会两种,一个是ATL宏,还有一个是API
这里要说一下那个ATL宏,是的,很简单
A2W( ) W2A( )
一眼就能看明白,A表示ANSI,W表示Wide,还有好多好多,可以去MSDN查一查,多好用的宏阿,可不能白用
#include <AtlBase.h>
#include <AtlConv.h>
这两句不能少,还有,用宏之前加一句 USES_CONVERSION ,要不然直接报错了
用这个宏还有一个问题,当我用 new 分了一块内存然后掉了这个宏,最后释放的时候报错了,怎么办?作为一个懒人我是不会去试图理解那么复杂的事的,我用数组,内存管理我不管
粗糙吧,是,不粗糙就用函数
int MultiByteToWideChar(
UINT CodePage, // code page | CP_ACP
DWORD dwFlags, // character-type options | MB_PRECOMPOSED
LPCSTR lpMultiByteStr, // string to map
int cbMultiByte, // number of bytes in string
LPWSTR lpWideCharStr, // wide-character buffer
int cchWideChar // size of buffer
);
int WideCharToMultiByte(
UINT CodePage, //code page | CP_ACP
DWORD dwFlags, //performance and mapping flags | WC_COMPOSITECHECK
LPCWSTR lpWideCharStr, //wide-character string
int cchWideChar, //number of chars in string
LPSTR lpMultiByteStr, //buffer for new string
int cbMultiByte, //size of buffer
LPCSTR lpDefaultChar, //default for unmappable chars |NULL
LPBOOL lpUsedDefaultChar //set when default char used |NULL
);
是的,排版是胡来的,能看清就行,我觉得说得够清楚了,只是那么多参数让人眼花缭乱,实在懒得去深究,所以我写了几个默认值,在 “|”后面,这是对像我这样的懒人和一些普通转换适用的,如果某高手看见了想指导我,好的,其实我也是一知半解。
基本上就这么多
应某人要求,加上最后一句 #Include <windows.h>