LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的區分與轉化

原地址 http://blog.csdn.net/jize00/article/details/4379478


首先在編譯程序時經常會遇到這種問題:

錯誤 1 error C2664: “CWnd::MessageBoxW”: 不能將參數 1 從“const char [3]”轉換爲“LPCTSTR”

 

1、覺得很煩,一般的做法就是不管三七二十一,在字符串前面加一個‘L’

如調用函數FUN(LPCTSTR str)時,不能  FUN("HELLO");     而是FUN(L"HELLO");

通常這樣做都比較能解決問題。

 

2、或者還可以用_T(), 即 FUN(_T("HELLO"));   _T() 的別名還有 _TEXT(), TEXT()。

 

稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等這些讓人頭暈的東東。(還是C#裏簡單啊,直接tostring)

 

BSTR:是一個OLECHAR*類型的Unicode字符串,是一個COM字符串,帶長度前綴,與VB有關,沒怎麼用到過。

 

LPSTR:即 char *,指向以'/0'結尾的8位(單字節)ANSI字符數組指針

LPWSTR:即wchar_t *,指向'/0'結尾的16位(雙字節)Unicode字符數組指針

 

LPCSTR:即const char *

LPCWSTR:即const wchar_t *

 

LPTSTR:LPSTR、LPWSTR兩者二選一,取決於是否宏定義了UNICODE或ANSI

LPCTSTR: LPCSTR、LPCWSTR兩者二選一,取決於是否宏定義了UNICODE或ANSI,如下是從MFC庫中拷來的:

#ifdef UNICODE

    typedef LPWSTR LPTSTR;

    typedef LPCWSTR LPCTSTR;

#else

    typedef LPSTR LPTSTR;

    typedef LPCSTR LPCTSTR;

#endif

3、相互轉換方法

LPWSTR->LPTSTR:   W2T();
LPTSTR->LPWSTR:   T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();

ANSI->UNICODE:     A2W();

UNICODE->ANSI:     W2A();

 

另外,CString轉爲CStringW方法(通過一個wchar_t數組來轉)

 CString str;

 CStringW strw;
 wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
 MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
 strw = text;

 

4、另外,還可以強行轉換,不過不一定能成功

 

5、還有_bstr_t ( 對BTSTR的封裝,需要#include<comdef.h> ),也可將單字節字符數組指針轉爲雙字節字符數組指針,還沒怎麼沒用到過。

發佈了13 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章