【问题标题】:vc++ - How to convert a CString into LPCWSTRvc++ - 如何将 CString 转换为 LPCWSTR
【发布时间】:2025-12-02 14:10:01
【问题描述】:

我试图这样做,但我没有找到任何方法。我问这个是因为我是 Windows 新手。我尝试了 stl-strings,但 Visual Studio 2008- 在 stl-wstring-handling 中积累了错误。稍后我会在其他问题上说很多关于这件事的内容。现在有人可以阐明这个问题吗?

【问题讨论】:

    标签: c++ visual-c++ mfc


    【解决方案1】:

    最简单的方法是使用 MFC 字符串转换宏,定义在:

    https://docs.microsoft.com/en-us/cpp/atl/reference/string-conversion-macros?view=msvc-160

    例如,将CString 转换为LPCWSTR 的宏是CT2W(s)

    另一种方法是使用专门的CStringACStringW 类。这些是 CString 的相应 ascii 和宽版本,具体取决于您是否使用 UNICODE 标志进行编译。所以你可以使用:

    CString your_string = "blah"
    CStringW wide_string = your_string;
    

    获取宽版本的字符串。

    【讨论】:

      【解决方案2】:

      像这样FuncTakingLPCWSTR(CT2CW(cstring_var)) 使用转换类CT2CW。这保证在 Unicode 或 MBCS 版本中都有效。

      另外,请记住,传递给函数的字符串可能是临时的,所以不要存储它以备后用。

      【讨论】:

        【解决方案3】:

        应该这样做,假设您的应用程序尚未设置为 Unicode(如果是,则直接转换):

        CString str("Hello, world!");
        CStringW strw(str);
        LPCWSTR ptr = strw;
        

        【讨论】:

        • 这么多令人费解(而且完全错误)的答案,而在 MFC 中做到这一点的唯一正确方法(通过转换 c'tors)没有得到任何支持?
        【解决方案4】:
        LPCWSTR pstr;
        CString cstrTemp;
        
        ...
        
        pstr = cstrTemp.AllocSysString();
        

        AllocSysString 将返回一个 BSTR 类型的字符串,可以直接转换为 LPCWSTR。

        【讨论】:

        • 无法将BSTR 转换为LPCWSTR。两种字符串类型都有不同的语义。例如,nullptr 始终是有效的BSTRLPCWSTR 不做任何保证。此外,需要清理BSTR,调用SysFreeString。您的代码没有显示这一点,您的解释也没有注意到这一点。由于 OP 要求 const 指针,因此他们甚至可能不需要副本。在这种情况下,内置的operator LPCTSTR() 可能已经足够了。真的,除非你需要BSTR,否则不要只使用一个,因为你不知道还能做什么。抱歉,-1。
        【解决方案5】:

        如果您定义了UNICODE,_UNICODE 编译器标志,那么一个简单的赋值应该可以工作。如果您定义了_MBCS,则需要使用MultiByteToWideChar 方法。

        【讨论】:

        • MFC 中过于复杂。最好按照建议使用 CStringW 或适当的 Cx2y 类。
        • CString 有转换 c'tors。如果您需要 ANSI 编码字符串中的宽字符串,只需执行 CStringW wideString(narrowString);,其中 narrowString 的类型为 CStringA
        【解决方案6】:

        您也可以使用 T2W() 宏来避免编写多行 MultiByteToWideChar 代码。

        【讨论】:

        • 最好使用 Cx2y 类而不是旧的 T 宏。