关于char[]转换成LPCWSTR的有关问题
LPCWSTR中的W是寬字符的意思,是UNICODE,就是說不是傳統(tǒng)的char這種單字節(jié)字符,而是一個字符占兩字節(jié).
編譯器把LoadImage解釋成了LoadImageW,說明代碼中某個地方定義了UNICODE開關(guān),編譯環(huán)境成了寬字節(jié)的,要把這個定義去掉.
Win32 API也分2中版本, MessageBoxA / MessageBoxW,,,MessageBox根據(jù)是否定義_UNICODE宏而定義到其中一個版本。
?
???? 二、正確的解決方案是
選擇【項目菜單】->【最后的屬性】->【配置屬性】->【常規(guī)】->【項目默認(rèn)值】->unicode改為未設(shè)置。
???? 三、幾個注意事項(此處引用了一個臺灣開發(fā)論壇的幾句話):
1,若定義UNICODE,相關(guān)的字串都必須使用Unicode的字串,而非ANSI字串。也就是:wchar_t * wfilename;(2)指定的Unicode字串常數(shù),請加L“...”;例如:wchar_t *wfilename = L “HelloWorld ”;
3.ansi字串(就是傳統(tǒng)的char*)與wchar_t的*unicode的的字符串互轉(zhuǎn),請用MultiByteToWideChar與WideCharToMultiByte這兩個API函數(shù)。
4,如果不太懂unicode的,那么就不要加UNICODE定義,用傳統(tǒng)的方式來處理。
???? 四、那么如何將char*或者char數(shù)組轉(zhuǎn)換成VS2005中的LPCWSTR呢?
(1)先看擊中錯誤的方法:
?????? char buffer[80];
錯誤方法一:
???????? wsprintf(buffer,L"WM_CHAR: Character = %c?? ",ascii_code);
???????? TextOut(hdc, 0,0,(LPCWSTR)buffer, strlen(buffer));
這個只能顯示第一個字母“W”
錯誤方法二:
???????? sprintf((LPCWSTR)buffer,L"Key State = 0X%X? ",key_state);
???????? TextOut(hdc, 0,16,(LPCWSTR)buffer, strlen(buffer));
這個出現(xiàn)的是亂碼!
錯誤方法三:???????
???????? sprintf(buffer,L"Key State = 0X%X? ",key_state);
???????? TextOut(hdc, 0,16,buffer, strlen(buffer));
這個提示不能將char[80]轉(zhuǎn)換成LPCWSTR
強制類型轉(zhuǎn)換是不行的,因為一個是字符占一個字節(jié),一個事占兩個字節(jié),但是sprintf等函數(shù)是不知道的。
(2)正確轉(zhuǎn)換方法:
方法一:使用MultiByteToWideChar和 MultiByteToWideChar函數(shù),大家可以參考CSDN論壇的這篇帖子http://topic.csdn.net/u/20080229/14/eb027e95-8e4e-4afe-abf3-b85d90427355.html?seed=824864853&r=60494553#r_60494553
代碼如下:
#include <windows.h>
#include <atlstr.h>
#define STRSAFE_NO_DEPRECATE
#include <strsafe.h>??????????? // for String... functions
#include <crtdbg.h>??????????????? // for _ASSERTE
??? CStringW ConvertW(CString str, int sourceCodepage)
??? {
??????? //int len=str.GetLength();
??????? int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0) + 1;
??????? wchar_t* pUnicode;
??????? pUnicode=new wchar_t[unicodeLen];
??????? memset(pUnicode,0,(unicodeLen)*sizeof(wchar_t));
??????? MultiByteToWideChar(sourceCodepage, CP_ACP, str, -1, (LPWSTR)pUnicode, unicodeLen);
??????? CStringW rt = pUnicode;
??????? //delete pUnicode;
??????? SAFE_DELETEGROUP( pUnicode );
??????? return rt;
??? }
調(diào)用:
?????? CStringW wszTemp = ConvertW( Filename, CP_ACP);
??????? LPWSTR pwStr = wszTemp.GetBuffer();?
總結(jié)
以上是生活随笔為你收集整理的关于char[]转换成LPCWSTR的有关问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java mod函数的使用方法_java
- 下一篇: vc中调用其他应用程序的方法(函数) w