ATL::数据类型转换[未完善]

 3年前     233  

文章目录

实在是分不清这些:PSTR、LPSTR、PCSTR、LPCSTR、LPWSTR、PWSTR、PCWSTR、LPCWSTR、LPCTSTR.....
于是把网上找的整理收集在这里,以备不时之需

前言

为了统一成大写,C++给char,wchar_t,const 取了个大写别名。
理解以上的命名规则就可以记住每种别名带表什么意思
N:代表near,在16位系统中代表16位的段内地址
L:代表long(far),在16位系统中代表16位的段地址+16位的偏移地址
在32位系统中 N和L已经没有作用,只是为了向前兼容(兼容16位机器)才保留这些定义。
P:代表指针
C:代表CONST(const)
W:代表WCHAR(wchar_t)
T:代表宏_T(一个兼容的宏,当定义了UNICODE或者_UNICODE是表示WCHAR,否则表示char)
CH:char的简写
STR:string的简写
BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串
LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针
LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针
LPCSTR:即const char *
LPCWSTR:即const wchar_t *

_T():
函数详解 _T(“”)是一个宏,他的作用是让你的程序支持 Unicode 编码 因为 Windows 使用两种字符集 ANSI 和 UNICODE, 前者就是通常使用的单字节方式, 但这种方式处理象中文这样的双字节字符不方便, 容易出现半个汉字的情况。 而后者是双字节方式,方便处理双字节字符。 Windows NT 的所有与字符有关的函数都提供两种方式的版本,而 Windows 9x 只支持 ANSI 方式。 如果你编译一个程序为 ANSI 方式, _T 实际不起任何作用。 而如果编译一个程序为 UNICODE 方式,则编译器会把”Hello”字符串以 UNICODE 方式保存。_T 和_L 的 区别在于,_L 不管你是以什么方式编译,一律以 UNICODE 方式保存。

LPSTR:
32-bit LPSTR 是一个指向以'\0'结尾的 ANSI 字符数组的指针,每个字符占 1 字节 ,与 char*可以 互换使用,在 win32 中较多地使用 LPSTR。LPSTR = char ,(typedef char LPSTR)

LPCSTR:
32-bit 指针指向一个指向以NULL('\0')结尾的ANSI常量字符串,每个字符占 1 字节 ,LPCSTR 中增加的‘C’的含义是“CONSTANT” (常量) ,表明这种数据类型的实例不能被使用它的 API 函数改变,除此之外,它与 LPSTR 是等同的。

PWSTR:
指向Unicode字符串的指针,每个字符占 2 字节。

PCWSTR:
指向一个恒定的Unicode字符串的指针,每个字符占 2 字节。

LPTSTR:
32-bit 指针每字符可能占 1 字节或 2 字节,取决于 Unicode 是否定义 L 是表示字符串资源为 Unicode 的。

LPCTSTR:
32-bit 指针指向一个常量字符串,每字符可能占 1 字节或 2 字节,取决于 Unicode 是否定义。如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串

相互转换方法:

LPWSTR<->LPTSTR

LPWSTR->LPTSTR:   W2T();
LPTSTR->LPWSTR:   T2W();

LPCWSTR<->LPCSTR

LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();

ANSI<->UNICODE:

ANSI->UNICODE:     A2W();
UNICODE->ANSI:     W2A();

ATL::CString 转 QString

ATL::CString cstr = L"dddd";
string strTest = CT2A(cstr .GetString());
showInfo(QString::fromStdString(strTest));

QString<->PCWSTR

QString qstr = "qstr";
PCWSTR pcwstr = qstr .toStdWString().c_str();

CString<->string

CString cstrTest = _T("test");
string strTest;
strTest= CT2A(cstrTest.GetString());

string strTest="test";
CString cstrTest;
cstrTest= CA2T(strTest.c_str());


CString cstrTest = _T("test");
string strTest;
string = CA2A(cstrTest.GetString());

string strTest="test";
CString cstrTest;
cstrTest= CA2A(strTest.c_str());

参考文章

  1. 关于char, wchar_t, TCHAR, _T,L,TEXT,_TEXT,LPSTR,LPCSTR,PWSTR,PCWSTR,LPTSTR,LPCTSTR的区别_TeaIsCold的博客-CSDN博客
    https://blog.csdn.net/teaiscold/article/details/78278396
  2.  ATL字符串转换宏_yunshouhu的博客-CSDN博客
    https://blog.csdn.net/earbao/article/details/11696929
  3. ATL 和 MFC 字符串转换宏 | 微软文档
    https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/87zae4a3(v=vs.100)?redirectedfrom=MSDN
  4. CString 与 string 间的转换_沙漏99的博客-CSDN博客_cstring string 转换
    https://blog.csdn.net/jaken99/article/details/103180203
版权声明:yuluo 发表于 3年前,共 2528 字。
转载请注明:ATL::数据类型转换[未完善] | 夏日回音

您可能感兴趣的

暂无评论

您必须 [ 登录 ] 才能发表留言!

暂无评论...