LPTSTR、LPCSTR、LPSTR、LPCTSTR、LPWSTR、LPCWSTR:
L 表示long指针 这是为了兼容Windows 3.1等16位操做系统遗留下来的,在win32中以及其余的32位操做系统中, long指针和near指针及far修饰符都是为了兼容的做用。没有实际意义。
P 表示这是一个指针
C 表示是一个常量
T 表示在Win32环境中, 有一个_T宏
STR 表示这个变量是一个字符串
LPSTR:32-bit指针,指向一个字符串,每一个字符占1字节char
LPCSTR: 32-bit指针,指向一个常字符串,每一个字符占1字节char
LPTSTR::32-bit指针,每字符可能占1字节或2字节,取决于Unicode是否认义 TCHAR
LPCTSTR::32-bit指针,指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否认义 TCHAR
LPWSTR:32-bit指针,每字符占2字节,数据类型为16位的wchar_t
LPCWSTR::32-bit指针,指向一个常字符串,每字符占2字节,数据类型为16位的wchar_t
Windows使用两种字符集ANSI和UNICODE,前者就是一般使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的状况。然后者是双字节方式,方便处理双字节字符。
MS推荐你使用相匹配的字符串函数,好比处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen,不然在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。
char* 是指向ANSI字符数组的指针,其中每一个字符占据8位(有效数据是除掉最高位的其余7位),这里保持了与传统的C,C++的兼容;
LP的含义是长指针(long pointer),LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*能够互换使用,在win32中较多地使用LPSTR。而LPCSTR中增长的‘C’的含义是“CONSTANT”(常量),代表这种数据类型的实例不能被使用它的API函数改变,除此以外,它与LPSTR是等同的。
数据类型转换:
CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
可使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,能够避免转换。
ATL宏介绍:html
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T数据库
A :ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。若是定义了 _UNICODE,则T表示W;若是定义了 _MBCS,则T表示A
C const 的缩写
利用这些宏,能够快速的进行各类字符间的转换。使用前必须包含头文件,而且申明USER_CONVERSION;使用 ATL 转换宏,因为不用释放临时空间,因此使用起来很是方便。可是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
一、只适合于进行短字符串的转换;
二、不要试图在一个次数比较多的循环体内进行转换;
三、不要试图对字符型文件内容进行转换,由于文件尺寸通常状况下是比较大的;
四、对状况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
转换示例:
char name[10];
TCHAR sex[5] ;
char *p = name;
TCHAR *pw = sex;
LPSTR lpstr = name;
LPCSTR lpcstr = name;
lpcstr = lpstr;
lpstr = p;
p = (char*)sex;
pw = (WCHAR*)name;
LPWSTR lpwstr = (LPWSTR)lpstr;
lpwstr = (LPWSTR)lpcstr;
LPCWSTR lpcwstr = (LPCWSTR)lpstr;
lpcwstr = (LPCWSTR)name;
CString str(lpstr);
CString str1(lpcstr);
CString str2(lpwstr);
CString str3(lpcwstr);
CString str4(name);
CString str5(sex);
lpwstr = (LPWSTR)(LPCWSTR)str;
lpstr = (LPSTR)(LPCWSTR)str;
lpcstr = (LPCSTR)(LPCWSTR)str;
p = (char*)str.GetBuffer();
pw = str.GetBuffer();
CString转换成LPSTR另外一种方式:
CString strFileName;
LPSTR
lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
在数据库里,有n前缀的字串类型就是UNICODE类型,这种类型中,固定用两个字节来表示一个字符,不管这个字符是汉字仍是英文字母,或是别的什么。
若是你要测试"abc汉字"这个串的长度,在没有n前缀的数据类型里,这个字串是7个字符的长度,由于一个汉字至关于两个字符。而在有n前缀的数据类型里,一样的测试串长度的函数将会告诉你是5个字符,由于一个汉字就是一个字符。