为什么我的留言箱出现在另一种语言?

时间:2016-08-02 04:11:10

标签: c++ messagebox

对上帝说实话,我现在正在失去理智。让我首先说一下,当我在其中定义文本和什么不是时,“MessageBox”函数在CodeBlocks中运行得非常好。但无论出于何种原因,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

1 个答案:

答案 0 :(得分:7)

它出现在另一种语言中的原因(通常,你看到的语言是乱码)是因为你正在使用字符串类型而不是使用正确的字符串类型:

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

此代码将基于ANSI的窄字符串转换为宽字符串。转换会转换字符串类型。如果你删除了强制转换,你会发现编译器会给你一个字符串类型/指针不匹配的错误。

由于您正在使用MessageBox函数,这实际上是对MessageBoxW的调用,这需要宽字符串参数。

在您的情况下调用MessageBoxW的原因是MessageBox将为MessageBoxAMessageBoxW,具体取决于构建类型(MBCS或分别为Unicode)。对于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),而不必应用强制转换。