VS2010 關於char*轉爲LPWSTR

最近在使用VS2010 提示錯誤 : error C2664: 'LoadImageW' : cannot convert parameter 2 from 'char [20]' to 'LPCWSTR'“char [20]”轉換爲“LPCWSTR”


     問題的原因:VS2010默認採用寬字符UNICODE編碼方式,定義了Unicode,因此相關的字符串必須爲unicode字符串,而非ascii字符串。

LPCWSTR中的W是寬字符的意思,是UNICODE,就是說不是傳統的char這種單字節字符,而是一個字符佔兩字節.
編譯器把LoadImage解釋成了LoadImageW,說明代碼中某個地方定義了UNICODE開關,編譯環境成了寬字節的,要把這個定義去掉.

Win32 API也分2中版本, MessageBoxA / MessageBoxW,,,MessageBox根據是否定義_UNICODE宏而定義到其中一個版本。

  
     正確的解決方案是
選擇【項目菜單】->【最後的屬性】->【配置屬性】->【常規】->【項目默認值】->unicode改爲未設置。


     幾個注意事項:

1,若定義UNICODE,相關的字串都必須使用Unicode的字串,而非ANSI字串。也就是:wchar_t * wfilename;

2,指定的Unicode字串常數,請加L“...”;例如:wchar_t *
wfilename= L“HelloWorld”;

3,ansi字串(就是傳統的char*)與wchar_t的*unicode的的字符串互轉,請用MultiByteToWideChar與WideCharToMultiByte這兩個API函數。

4,如果不太懂unicode的,那麼就不要加UNICODE定義,用傳統的方式來處理。
 
    如何轉換呢 ?

錯誤方法一:
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));
這個出現的是亂碼!
錯誤方法三: 
sprintf(buffer,L"Key State = 0X%X ",key_state);
TextOut(hdc, 0,16,buffer, strlen(buffer));
這個提示不能將char[80]轉換成LPCWSTR
強制類型轉換是不行的,因爲一個是字符佔一個字節,一個佔兩個字節,但是sprintf等函數是不知道的。

方法一:使用WideCharToMultiByte和 MultiByteToWideChar函數
 

代碼如下:
#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;


}


調用:
CStringW wszTemp = ConvertW( Filename, CP_ACP);
LPWSTR pwStr = wszTemp.GetBuffer();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章