0

我正在使用一个库,并std::wstring从它的一个功能和另一个需要_TCHAR []发送给它的库中发送给我。我怎样才能转换它?

4

3 回答 3

2

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

例如

void func(const wchar_t str[])
{
}

std::wstring src;
func(src.c_str());

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

于 2010-12-07T00:47:27.757 回答
0

正如@Zach Saw所说,如果你只为 Unicode 构建,你可以侥幸逃脱std::wstring.c_str(),但从概念上讲,最好定义一个tstring(a typedeffor std::basic_string<TCHAR>),这样你就可以安全地使用这种字符串完美地与所有期望的 Windows 和库函数一起使用1 . TCHAR_

为了获得更多乐趣,您还应该为 s 定义所有其他与字符串相关的 C++ 工具TCHAR,并创建转换函数std::string/ std::wstring<=> tstring

幸运的是,这项工作已经完成;看这里这里


  1. 实际上没有编译的库函数可以真正期望 a TCHAR *,因为TCHARs 在编译时被解析为chars 或wchar_ts ,但你明白了。
于 2010-12-07T00:53:16.963 回答
0

使用ATL 和 MFC 字符串转换宏。无论您是在_UNICODEANSI 模式下还是在 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;
}
于 2010-12-07T01:17:01.137 回答