原地址 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> ),也可將單字節字符數組指針轉爲雙字節字符數組指針,還沒怎麼沒用到過。