老实说,我现在正在失去理智.让我首先说一下,当我在其中定义文本和什么不是时,"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);
}
Run Code Online (Sandbox Code Playgroud)
而不是它按照我原来的想法工作,而不是因此得到了这个:

这对我来说非常紧张,我知道在此之前已经问了一次,所以请不要将我的问题标记为重复.如何使这段代码工作,以便我的信息以英文显示,并描绘我想说清楚的内容?
提前谢谢,
MTS
它出现在另一种语言中的原因(通常,你看到的语言是乱码)是因为你正在使用字符串类型而不是使用正确的字符串类型:
LPCWSTR b;
std::string t = "MTS";
b = (LPCWSTR)t.c_str();
Run Code Online (Sandbox Code Playgroud)
此代码并没有把一个狭窄的,基于ANSI字符串转换成宽字符串.铸造并没有转换字符串类型.如果你删除了强制转换,你会发现编译器会给你一个字符串类型/指针不匹配的错误.
由于您正在使用该MessageBox函数,这实际上是一个调用MessageBoxW,这需要宽字符串参数.
在你的情况下,为什么MessageBoxW被调用的原因是,MessageBox它将是MessageBoxA或MessageBoxW,取决于构建类型(MBCS或Unicode分别).对于CodeBlocks,您可能已将项目设置为MBCS,而在Visual Studio上,它被设置为Unicode,因此它适用于一个项目,而另一个项目则失败.
因此,修复是在这种情况下提供一个宽字符串:
LPCWSTR b;
std::wstring t = L"MTS";
b = t.c_str();
Run Code Online (Sandbox Code Playgroud)
甚至这个:
LPCWSTR b;
std::basic_string<WCHAR> t = L"MTS";
b = t.c_str();
Run Code Online (Sandbox Code Playgroud)
如果您希望两个代码都具有相同的代码,MBCS并且Unicode在没有编码更改的情况下进行构建,则还可以使用以下代码:
#include <tchar.h>
//...
LPCTSTR b;
std::basic_string<TCHAR> t = _T("MTS");
b = t.c_str();
Run Code Online (Sandbox Code Playgroud)
这使用_T(或TEXT宏)使字符串文字变窄或变宽,具体取决于构建类型.的TCHAR要么是窄或宽的,这取决于生成类型.
底线是这样的-如果你调用一个需要字符串的函数,编译器给你一个错误的字符串类型不匹配,也不会尝试C-风格转换"修理"的编译错误.对于字符串尤其如此.相反,要么
1)提供正确的字符串类型,以便永远不需要进行铸造,
要么
2)调用MessageBoxA接受字符串类型的正确函数(在本例中),而不必应用强制转换.