1、LPCTSTR是什么?
A 32-bit pointer to a contant character stirng that is portable forUnicode and DBCS(double-byte character sets)
LPCTSTR就是一個(gè)32-bit指針指向一個(gè)常字符串,每字符可能占1字節(jié)或2字節(jié),取決于Unicode是否定義
LPCTSTR是一個(gè)windows API數(shù)據(jù)類(lèi)型。根據(jù)windows API數(shù)據(jù)類(lèi)型的命名規(guī)律:
1)L——long 指針,是為了兼容Window3.1等16位扣件系統(tǒng)遺留下來(lái)的,
在Win32中以及其他的32的扣件系統(tǒng)中,long 指針和near 指針及far 修飾符都是為了兼容的作用,而沒(méi)有實(shí)際意義。
2)P表示該變量是一個(gè)指針,C表示是常量(const),STR表示的是字符串。因此LPCSTR是一個(gè)const char*類(lèi)型。
這是一個(gè)windows(ANSI)字符串常量,它是多字節(jié)編碼的。
3)LPCWSTR:而W表示的是寬字符,因此LPCWSTR表示的也是字符串常量,不過(guò)是Unicode編碼的。
注:
1)LPCTSTR:根據(jù)環(huán)境配置,如果定義了UNICODE宏,則是LPCWSTR類(lèi)型,否則是LPCSTR類(lèi)型。
2)這里的Unicode是Wondows的一種字符集
Windows使用兩種字符集ANSI和UNICODE,
ANSI就是通常使用的單字節(jié)方式,但這種方式處理象中文這樣的雙字節(jié)字符不方便,
容易出現(xiàn)半個(gè)漢字的情況。UNICODE是雙字節(jié)方式,方便處理雙字節(jié)字符。
2、問(wèn)題的解決
通常我們手動(dòng)輸入的字符串都是const char*(即LPCSTR)類(lèi)型的,若出現(xiàn)不兼容
可以對(duì)輸入的參數(shù)用使用“_T”宏:
例如:
MessageBox("Help,Somethig went wong.","Error",MB_ICONERROR|MB_OK);
在第一個(gè)和第二個(gè)參數(shù)的地方,程序會(huì)報(bào)錯(cuò):"const char *"類(lèi)型的實(shí)參與"LPCWSTR"類(lèi)型的形參不兼容
這是第一個(gè)和第二個(gè)參數(shù)都是我們手動(dòng)輸入的字符串,都為const char * 類(lèi)型的,而以上的兩個(gè)參數(shù)均為LPCTSTR類(lèi)型。
MessageBox這個(gè)函數(shù),它與LPCTSTR類(lèi)似,當(dāng)工程采取不同編碼方式的時(shí)候,對(duì)應(yīng)的實(shí)際函數(shù)不同。
當(dāng)采取Unicode編碼時(shí),實(shí)際調(diào)用的是MessageBoxW,該函數(shù)接受的參數(shù)是LPCWSTR;
當(dāng)采取的是多字節(jié)編碼時(shí),實(shí)際調(diào)用的是MessageBoxA,該函數(shù)接受的參數(shù)是LPCSTR。
解決方法是對(duì)第一個(gè)和第二個(gè)參數(shù)使用“_T”宏:
MessageBox(_T("Help,Something went wrong"),_T("Error"),MB_OK);
_T("")是一個(gè)宏,他的作用是讓你的程序支持Unicode編碼.
---------
不過(guò)我用_T 會(huì)有未定義的標(biāo)識(shí)符的錯(cuò)誤提示,最后的通過(guò)設(shè)置編碼類(lèi)型解決的。