如何将CString转换或转换为LPWSTR?

时间:2013-09-16 22:22:54

标签: c++ winapi mfc

我尝试使用此代码:

USES_CONVERSION;
LPWSTR temp = A2W(selectedFileName);

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

提前致谢

3 个答案:

答案 0 :(得分:5)

如果我没记错,CStringCStringACStringW的类型定义,具体取决于您是否构建Unicode。

LPWSTR是“广泛指向的长指针” - 又名: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));

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

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

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

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

答案 1 :(得分:1)

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

如果您需要 const 指针,则只需使用static_cast<LPCWSTR>(selectedFilename)

答案 2 :(得分:1)

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

然而,这对我的unicode构建起了作用:

LPWSTR temp = (LPWSTR)(LPCWSTR)selectedFileName;