C++ 如何从std::wstring _TCHAR[]转换?

C++ 如何从std::wstring _TCHAR[]转换?,c++,windows,visual-c++,tchar,C++,Windows,Visual C++,Tchar,我正在使用一个库并从它的一个函数向我发送std::wstring,另一个库需要向它发送\u TCHAR[]。如何转换它?假设您使用的是Unicode构建,std::wstring.c_str()就是您所需要的。注意,c_str()保证它返回的字符串以null结尾 e、 g 如果您使用的是非Unicode构建,则需要通过将Unicode字符串转换为非Unicode字符串。正如@Zach Saw所说,如果您仅为Unicode构建,则可以使用std::wstring.c_str(),但从上下文角度来看

我正在使用一个库并从它的一个函数向我发送
std::wstring
,另一个库需要向它发送
\u TCHAR[]
。如何转换它?

假设您使用的是Unicode构建,std::wstring.c_str()就是您所需要的。注意,c_str()保证它返回的字符串以null结尾

e、 g

如果您使用的是非Unicode构建,则需要通过将Unicode字符串转换为非Unicode字符串。

正如@Zach Saw所说,如果您仅为Unicode构建,则可以使用
std::wstring.c_str()
,但从上下文角度来看,最好定义
tstring
(对于
std::basic_string
,使用
typedef
)因此,您可以安全地将这种字符串完美地用于所有需要
TCHAR
s1的窗口和库函数

另外,您还应该为 TCHAR s定义所有其他与字符串相关的C++设备,并创建转换函数<代码> STD::String < /Calp>/Cudio> STD::WString 代码> TString 幸运的是,这项工作已经完成;见和


  • 实际上,没有一个编译过的库函数能够真正期望
    TCHAR*
    ,因为
    TCHAR
    s在编译时被解析为
    char
    s或
    wchar\u t
    s,但是您已经知道了
  • 使用。无论您是在
    \u UNICODE
    还是在ANSI模式下编译,此功能都有效

    即使不使用MFC,也可以使用这些宏。仅包括本例中显示的两个ATL头:

    #include <string>
    
    #include <Windows.h>
    
    #include <AtlBase.h>
    #include <AtlConv.h>
    
    int main()
    {
        std::wstring myString = L"Hello, World!";
    
        // Here is an ATL string conversion macro:
        CW2T pszT(myString.c_str());
    
        // pszT is now an object which can be used anywhere a `const TCHAR*`
        // is required. For example:
        ::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    int main()
    {
    std::wstring myString=L“你好,世界!”;
    //以下是ATL字符串转换宏:
    CW2T pszT(myString.c_str());
    //pszT现在是一个可以在任何地方使用的对象*`
    //是必需的。例如:
    ::MessageBox(NULL,pszT,_T(“测试MessageBox”),MB_OK);
    返回0;
    }
    
    另一个库是否接受常量?即,它是否打算更改数据?如果是的话,它可能会延长数据吗?是的,常数[]是可以的。它不打算更改数据。什么是_TCHAR在Unicode版本中定义为wchar,但在非Unicode版本中定义为char。我想wchar是因为我使用的是wstring?仅仅因为您使用的是std::wstring并不意味着TCHAR是wchar。查找你的构建定义。C++库可以期待<代码> TCHAR *<代码>。毕竟,C++在参数类型上有过载。这将是一个不寻常的构建,但MSVC的名字mangling可以处理它。大多数Win32 DLL还期望一个TCHAR,尽管名称的“MULLGLE”是通过“A/W”后缀宏建立起来的。编译的C++库不能真正地期望<代码> TCHAR *<代码>,它将有两个独立的(超载)函数,一个接受“代码> char */CODE”,一个接受“代码> WCARGYT*<代码>,否则,它无法处理使用
    \u UNICODE
    宏的不同设置编译的项目。这正是我写便条的初衷。
    #include <string>
    
    #include <Windows.h>
    
    #include <AtlBase.h>
    #include <AtlConv.h>
    
    int main()
    {
        std::wstring myString = L"Hello, World!";
    
        // Here is an ATL string conversion macro:
        CW2T pszT(myString.c_str());
    
        // pszT is now an object which can be used anywhere a `const TCHAR*`
        // is required. For example:
        ::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
    
        return 0;
    }