【发布时间】:2025-12-02 14:10:01
【问题描述】:
我试图这样做,但我没有找到任何方法。我问这个是因为我是 Windows 新手。我尝试了 stl-strings,但 Visual Studio 2008- 在 stl-wstring-handling 中积累了错误。稍后我会在其他问题上说很多关于这件事的内容。现在有人可以阐明这个问题吗?
【问题讨论】:
标签: c++ visual-c++ mfc
我试图这样做,但我没有找到任何方法。我问这个是因为我是 Windows 新手。我尝试了 stl-strings,但 Visual Studio 2008- 在 stl-wstring-handling 中积累了错误。稍后我会在其他问题上说很多关于这件事的内容。现在有人可以阐明这个问题吗?
【问题讨论】:
标签: c++ visual-c++ mfc
最简单的方法是使用 MFC 字符串转换宏,定义在:
https://docs.microsoft.com/en-us/cpp/atl/reference/string-conversion-macros?view=msvc-160
例如,将CString 转换为LPCWSTR 的宏是CT2W(s)。
另一种方法是使用专门的CStringA 和CStringW 类。这些是 CString 的相应 ascii 和宽版本,具体取决于您是否使用 UNICODE 标志进行编译。所以你可以使用:
CString your_string = "blah"
CStringW wide_string = your_string;
获取宽版本的字符串。
【讨论】:
像这样FuncTakingLPCWSTR(CT2CW(cstring_var)) 使用转换类CT2CW。这保证在 Unicode 或 MBCS 版本中都有效。
另外,请记住,传递给函数的字符串可能是临时的,所以不要存储它以备后用。
【讨论】:
应该这样做,假设您的应用程序尚未设置为 Unicode(如果是,则直接转换):
CString str("Hello, world!");
CStringW strw(str);
LPCWSTR ptr = strw;
【讨论】:
LPCWSTR pstr;
CString cstrTemp;
...
pstr = cstrTemp.AllocSysString();
AllocSysString 将返回一个 BSTR 类型的字符串,可以直接转换为 LPCWSTR。
【讨论】:
BSTR 转换为LPCWSTR。两种字符串类型都有不同的语义。例如,nullptr 始终是有效的BSTR。 LPCWSTR 不做任何保证。此外,需要清理BSTR,调用SysFreeString。您的代码没有显示这一点,您的解释也没有注意到这一点。由于 OP 要求 const 指针,因此他们甚至可能不需要副本。在这种情况下,内置的operator LPCTSTR() 可能已经足够了。真的,除非你需要BSTR,否则不要只使用一个,因为你不知道还能做什么。抱歉,-1。
如果您定义了UNICODE,_UNICODE 编译器标志,那么一个简单的赋值应该可以工作。如果您定义了_MBCS,则需要使用MultiByteToWideChar 方法。
【讨论】:
CString 有转换 c'tors。如果您需要 ANSI 编码字符串中的宽字符串,只需执行 CStringW wideString(narrowString);,其中 narrowString 的类型为 CStringA。
您也可以使用 T2W() 宏来避免编写多行 MultiByteToWideChar 代码。
【讨论】: