如何将 CString 转换或转换为 LPWSTR

how to convert or cast CString to LPWSTR?

本文关键字:转换 LPWSTR CString      更新时间:2023-10-16

我尝试使用以下代码:

USES_CONVERSION;
LPWSTR temp = A2W(selectedFileName);

但是当我检查temp变量时,只需获取第一个字符

提前致谢

如果我没记错的话,CString被typedef'd为CStringACStringW,这取决于你是否在构建Unicode。

LPWSTR是"指向宽 STRing 的长指针"——又名:wchar_t*

如果要将CString传递给需要LPWSTR的函数,则可以执行以下操作:

some_function(LPWSTR str);
// if building in unicode:
some_function(selectedFileName);
// if building in ansi:
some_function(CA2W(selectedFileName));
// The better way, especially if you're building in both string types:
some_function(CT2W(selectedFileName));

但是LPWSTR是对字符串的非常量访问。 您是否正在使用尝试修改字符串的函数? 如果是这样,您希望使用实际缓冲区,而不是CString

另外,当你"检查"temp时 - 你是什么意思? 你试过cout << temp吗? 因为这不起作用(它将只显示第一个字符):

char 每个字符使用一个字节。 wchar_t每个字符使用两个字节。 对于纯英语,当您将其转换为宽字符串时,它使用与原始字符串相同的字节,但每个字符都用零填充。 由于NULL终止符也是零,因此如果使用较差的调试器或 cout(使用 ANSI 文本),则只会看到第一个字符。

如果要将宽字符串打印为标准输出,请使用 wcout

简而言之:你不能。如果需要指向CString对象的基础字符缓冲区的非常量指针,则需要调用GetBuffer

如果您需要常量指针,您可以简单地使用 static_cast<LPCWSTR>(selectedFilename) .

我知道

这是一个相当古老的问题,但我也有同样的问题,以前的答案都不适合我。

但是,这确实适用于我的 unicode 构建:

LPWSTR temp = (LPWSTR)(LPCWSTR)selectedFileName;

LPWSTR 是一个"指向宽字符串的长指针"。它就像wchar*。

CString strTmp = "temp";
wchar* szTmp;
szTmp = new WCHAR[wcslen(strTmp) + 1];
wcscpy_s(szTmp, wcslen(strTmp) + 1, strTmp);