VC++ BSTR、LPSTR、LPWSTR 区别与联系(学习笔记)

STR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统

提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化

技术以外的多种场合下得到广泛使用。

LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。
LPSTR被定义成是一个指向以NULL(‘/0’)结尾的8位ANSI字符数组指针,
LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等。

--------------------------------------------------------------

使用 ATL 提供的转换宏。

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


上表中的宏函数,其实非常容易记忆:

2 好搞笑的缩写,to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。
A ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
C const 的缩写

 

#include  < atlconv.h >
      
      
void  fun()
      
{
           USES_CONVERSION;  
//  只需要调用一次,就可以在函数中进行多次转换
          
           LPCTSTR lp 
=  OLE2CT( L( " Hello,你好 " ) );
           ... ... ... ...
          
//  不用显式释放 lp 的内存,因为
          
//  由于 ATL 转换宏使用栈作为临时空间,函数结束后会自动释放栈空间。
       }

 



LPSTR 一个32位的指向字符串的指针   

LPCSTR 一个32位的指向字符串常量的指针   
LPWSTR 一个32位的指向unicode字符串的指针   
LPCWSTR 个32位的指向unicode字符串常量的指针   
    
前面的L代表LONG,P就是指针的意思,C就是constant的意思   
W是wide的意思,STR就是string的意思  

--------------------------------------------------------------

   记下几个字符串东东,即他们得区别:

    LPSTR:一个32位指向字符串的指针,相当于char *;

    LPCSTR:一个32位指向字符串常量的指针,相当于const char *;

    LPWSTR:一个32位指向Unicode字符串指针,相当于wchar_t *;

    LP
CWSTR:一个32位指向Unicode字符串常量指针,相当于const wchar_t *;
   

1  #ifdef UNICODE

2   typedef LPWSTR LPTSTR;

3   typedef LPCWSTR LPCTSTR;

4  #else

5   typedef LPSTR LPTSTR;

6   typedef LPCSTR LPCTSTR;

7  #endif

    
    当然我们也可以相互转换一下(强行转换会变乱码):

    LPWSTR--->LPTSTR: W2T();

    LPTSTR--->LPWSTR: T2W();

    LPCWSTR--->LPCSTR: W2CT();

    LPCSTR--->LPCWSTR:T2CW();

    上面我们可以看到L为LONG,P为POINT指针,W为WIDE,C为constant,STR为string。

--------------------------------------------------------------

LPSTR 一个32位的指向字符串的指针 
LPCSTR 一个32位的指向字符串常量的指针 
LPWSTR 一个32位的指向unicode字符串的指针 
LPCWSTR 个32位的指向unicode字符串常量的指针 

前面的L代表LONG,P就是指针的意思,C就是constant的意思 
W是wide的意思,STR就是string的意思

具体的定义参看头文件 
有C的表示是const字符串,不能被修改,没有的C的是不同字符串 
有W的是unicode字符串,宽度力2个字节,没有W的是ascii字符串,宽度1个字节

--------------------------------------------------------------

如何理解LPCTSTR, 
L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。

P表示这是一个指针
C表示是一个常量
T在Win32环境中, 有一个_T宏, 这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏, 那么这个字符或者字符串将被作为UNICODE字符串, 否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。

所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
同样, LPCSTR就只能是一个ANSI字符串, 在程序中我们大部分时间要使用带T的类型定义。

LPCTSTR == const TCHAR *

 

--------------------------------------------------------------

1/char转换成LPWSTR的小问题error C2664: 'SQLGetInstalledDriversW' : cannot convert parameter 1 from 'char [2001]' to 'LPWSTR'
请教高手如何转换?? 


你把char直接改为wchar_t不就行了? 
估计你的定义是 
char buf[2001];然后在unicode 模式下编译程序,可以改为 
TCHAR buf[2001];或者wchar_t buf[2001]; 
第一种方式可以适应mbcs和unicode2种编码方式。

--------------------------------------------------------------

如果是UNICODE环境,则LPCTSTR 是const wchar_t*的宏定义,要想转换成const char*,则可以使用W2A宏进行处理。如果是非UNICODE则不需要转换,可直接使用。


你可能感兴趣的:(VC++ BSTR、LPSTR、LPWSTR 区别与联系(学习笔记))