我尝试使用此代码:
USES_CONVERSION;
LPWSTR temp = A2W(selectedFileName);
但是当我检查temp
变量时,只需获取第一个字符
提前致谢
如果我没记错的话,CString
是 typedef'd 到CStringA
or 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
.
简而言之:你不能。如果需要指向CString
对象底层字符缓冲区的非常量指针,则需要调用GetBuffer
.
如果你需要一个const指针,你可以简单地使用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);