MFC中關於char 轉換成LPCWSTR的問題

2021-09-29 14:04:05 字數 2058 閱讀 9332

在寫win32應用程式時候,你可能遭遇到如下錯誤 : 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定義,用傳統的方式來處理。

四、那麼如何將char*或者char陣列轉換成vs2010中的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)); 

這個出現的是亂碼! 

錯誤方法三: 

sprintf(buffer,l」key state = 0x%x 「,key_state); 

textout(hdc, 0,16,buffer, strlen(buffer)); 

這個提示不能將char[80]轉換成lpcwstr

強制型別轉換是不行的,因為乙個是字元佔乙個位元組,乙個事佔兩個位元組,但是sprintf等函式是不知道的。

(2)正確轉換方法:

方法一:使用multibytetowidechar和 multibytetowidechar函式,大家可以參考csdn論壇的這篇帖子

**如下:

#include #include #define strsafe_no_deprecate

#include // for string... functions

#include // for _asserte

cstringw convertw(cstring str, int sourcecodepage)

呼叫: 

cstringw wsztemp = convertw( filename, cp_acp); 

lpwstr pwstr = wsztemp.getbuffer();

或將char改為tchar

MFC中CString轉換成char陣列的問題

由於結構體中用到聯合體 聯合體需要確定分配記憶體分配大小 或其它因素,需要用char陣列來儲存字串,但是在mfc中一般都是用cstring來存放字條串。關於它們之間的轉換,在vs2008中有時會出現異常情況。在msdn是這樣寫的 cstring orig hello,world convert to...

MFC中CString轉換成char陣列的問題

由於結構體中用到聯合體 聯合體需要確定分配記憶體分配大小 或其它因素,需要用char陣列來儲存字串,但是在mfc中一般都是用cstring來存放字條串。關於它們之間的轉換,在vs2008中有時會出現異常情況。在msdn是這樣寫的 cstring orig hello,world convert to...

將string轉換成char

string 是c 標準庫裡面其中乙個,封裝了對字串的操作 把string轉換為char 有3中方法 1.data 如 如 string str abc char p str.data 2 c str 如 如 string str gdfd char p str.c str 3.copy 比如比如 ...