如何连接LPCWSTR

How to concatenate a LPCWSTR?

本文关键字:LPCWSTR 连接 何连接      更新时间:2023-10-16

我该如何接受。。。

string modelPath = "blah/blah.obj"

并将其与…连接。。。

L" not found." 

同时将其作为LPCWSTR传入。我试着做

(LPCWSTR)(modelPath + " was not found.").c_str()

然而,这并没有奏效。下面是一个更大的例子来说明它现在的样子。

if(!fin)
{
    MessageBox(0, L"Models/WheelFinal.txt not found.", 0, 0); //
    return;
}

LPCWSTRLongp指向ConstantWideSTRing的指针。宽字符串(至少在Win32中)是16位,而(const) char字符串(即(C)STR或其指针对应LP(C)STR)是8位。

将Win32上的它们想象为typedef const char* LPCSTRtypedef const wchar_t* LPCWSTR

std::string是一个8位字符串(默认使用底层类型char),而std::wstring是一个更宽的字符串(即win32上的16位,默认使用wchar_t)。

如果可以,请使用std::wstring连接一个L"string"作为插入替换。


关于MessageBox()的一点注记

Windows有一个有趣的习惯,即为API调用定义宏,在给定程序的多字节配置的情况下,这些宏会切换出底层调用。对于几乎每一个使用字符串的API调用,都有一个FunctionAFunctionW调用分别使用LPCSTRLPWCSTR

CCD_ 19就是其中之一。在Visual Studio中,您可以进入项目设置并更改多字节(宽/窄)设置,也可以直接调用MessageBoxA/W以传入不同的字符串编码。

例如:

LPWCSTR wideString = L"Hello, ";
MessageBoxW(NULL, (std::wstring(wideString) + L"world!").c_str(), L"Hello!", MB_OK);
LPCSTR narrowString = "Hello, ";
MessageBoxA(NULL, (std::string(narrowString) + "world!").c_str(), "Hello!", MB_OK);

如果您可以将modelPath更改为std::wstring,这将变得很容易:

MessageBox(nullptr, (modelPath + L" not found.").c_str(), nullptr, 0);

我也将您的0指针值更改为nullptr

由于std::string表示窄字符串,std::wstring表示宽字符串,并且两者有很大的不同,因此从一种表示转换到另一种表示是不可行的,而从合适的表示开始则可行。另一方面,可以使用C++11中的新<codecvt>报头在表示之间进行适当的转换。