3

我尝试使用此代码:

USES_CONVERSION;
LPWSTR temp = A2W(selectedFileName);

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

提前致谢

4

4 回答 4

8

如果我没记错的话,CString是 typedef'd 到CStringAor CStringW,这取决于您是否正在构建 Unicode。

LPWSTR是“指向宽字符串的长指针”——又名:wchar_t*

如果要将 a 传递给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));

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

另外,当你“检查”时temp——你是什么意思?你试过了cout << temp吗?因为那行不通(它只会显示第一个字符):

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

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

于 2013-09-16T22:50:52.857 回答
1

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

如果你需要一个const指针,你可以简单地使用static_cast<LPCWSTR>(selectedFilename).

于 2013-09-16T23:46:22.693 回答
1

我知道这是一个相当老的问题,但我也有同样的问题,以前的答案都没有对我有用。

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

LPWSTR temp = (LPWSTR)(LPCWSTR)selectedFileName;
于 2016-01-25T20:05:28.903 回答
0

LPWSTR 是“指向宽字符串的长指针”。就像 wchar*。

CString strTmp = "temp";
wchar* szTmp;
szTmp = new WCHAR[wcslen(strTmp) + 1];
wcscpy_s(szTmp, wcslen(strTmp) + 1, strTmp);
于 2022-01-10T05:27:34.580 回答