2016-08-02 59 views
3

對上帝誠實,我現在失去了我的想法。讓我首先說CodeBlocks中的「MessageBox」函數完美地工作,當我定義它裏面的文本和什麼不是;但無論出於何種原因,Visual Studio對於此MessageBox函數的內容都很挑剔。爲什麼我的信息框以另一種語言顯示?

它一直告訴我,無論我放在裏面對LPCWSTR「事物」都是無效的。爲了規避這個問題,我編程下面這件事:

int main() 
{ 
LPCWSTR a; 
std::string s = "Please help me."; 
a = (LPCWSTR)s.c_str(); 

LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

    MessageBox(0,a,b, MB_OK | MB_ICONSTOP); 
} 

相反,它的工作我最初是如何想的那樣,我不是得到這個結果:

Image

這是非常緊張我和我知道它已經在這裏被問過一次了,所以請不要將我的問題標記爲重複。我如何使這些代碼正常工作,以便我的信息以英文顯示並描繪我想要說清楚的內容?

由於時間提前,

MTS

+0

'MessageBox'需要'LPCTSTR'參數,但是您要給它'LPCWSTR'。嘗試將'a'和'b'聲明/鑄造爲'LPCTSTR's? – Doc

+0

@Doc a)如果MessageBox變成MessageBoxA或MessageBoxW取決於項目設置/預處理器的東西。 b)鑄造沒有幫助。 c)用日語輸出,它是W變體。 – deviantfan

回答

7

它之所以用另一種語言顯示出來(通常,它是在你看到的語言亂碼)是你鑄造串類型,而不是使用適當的字符串類型:

LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

此代碼轉窄,基於ANSI字符串轉換成寬字符串。鑄造不是轉換字符串類型。如果你刪除了這個轉換,你會發現編譯器給你一個字符串類型/指針不匹配的錯誤。

由於您使用的是MessageBox函數,實際上這是對MessageBoxW的調用,它需要寬字符串參數。

你的情況之所以MessageBoxW被稱爲是MessageBox要麼是MessageBoxAMessageBoxW,取決於構建類型(MBCSUnicode,分別)。對於CodeBlocks,您可能將您的項目設置爲MBCS,而在Visual Studio中,它設置爲Unicode,因此它適用於一個項目,並且在另一個項目上失敗。

因此,解決方法是提供在這種情況下,寬字符串:

LPCWSTR b; 
std::wstring t = L"MTS"; 
b = t.c_str(); 

,甚至這樣的:

LPCWSTR b; 
std::basic_string<WCHAR> t = L"MTS"; 
b = t.c_str(); 

如果你想有兩個MBCSUnicode相同的代碼工作中產生沒有編碼變化,那麼也可以使用以下內容:

#include <tchar.h> 
//... 
LPCTSTR b; 
std::basic_string<TCHAR> t = _T("MTS"); 
b = t.c_str(); 

這使用_T(或TEXT宏)使字符串文字變窄或變寬,這取決於構建類型。取決於構建類型,TCHAR將變窄或變寬。


底線是這樣的 - 如果你調用一個需要字符串的函數,編譯器給你一個錯誤的字符串類型不匹配,做到試C-風格的轉換以「修復」編譯器錯誤。字符串尤其如此。相反,無論是

1)提供正確的字符串類型,使鑄造是將沒有必要,

2)調用正確的函數(在接受您的字符串類型,而不必這種情況下MessageBoxA)施放演員。

+0

謝謝一個男人,這讓我瘋狂 – MTS

相關問題