我需要在我的项目中连接对话框的名称(类型为wchar_t)和配置名称(类型为TCHAR)。 我怎样才能做到这一点? 感谢。
答案 0 :(得分:4)
这取决于,TCHAR是以太char
还是wchar_t
,具体取决于您是否将应用程序构建为Unicode。如果您将应用程序构建为Unicode,则可以执行以下操作:
wcscat_s(dest, extra);
如果您不将应用程序构建为Unicode,则需要将TCHAR:s的字符串(后面是char
:s的字符串)转换为wchar_t
:s的字符串或者您的wchar_t
:s字符串成为char
:s的字符串。为此,您应该查看MultiByteToWideChar或WideCharToMultiByte函数。这两个参数看起来有点可怕,所以我通常会使用一些帮助器(请注意,为了清楚起见,已经删除了正确的错误处理,正确的解决方案也会调整上面提到的函数在一个调整大小的循环中缓冲,如果调用失败并带有ERROR_INSUFFICIENT_BUFFER
):
std::wstring multiByteToWideChar(const std::string &s)
{
std::vector<wchar_t> buf(s.length() * 2);
MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
s.c_str(),
s.length(),
&buf[0],
buf.size());
return std::wstring(&buf[0]);
}
std::string wideCharToMultiByte(const std::wstring &s)
{
std::vector<char> buf(s.length() * 2);
BOOL usedDefault = FALSE;
WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
s.c_str(),
s.length(),
&buf[0],
buf.size(),
"?",
&usedDefault);
return std::string(&buf[0]);
}
除了那些我设置了一个类型特征类,所以我可以编译我的项目作为Unicode,不管没有照顾:
template <class CharT>
struct string_converter_t;
template <>
struct string_converter_t<char>
{
static std::wstring toUnicode(const std::string &s)
{
return multiByteToWideChar(s);
}
static std::string toAscii(const std::string &s)
{
return s;
}
static std::string fromUnicode(const std::wstring &s)
{
return wideCharToMultiByte(s);
}
static std::string fromAscii(const std::string &s)
{
return s;
}
};
wchar_t
的一个几乎相同的实例(我将其作为一个例外)。在你的情况下,你可以简单地做:
std::wstring result = dialog_name + string_converter_t<TCHAR>::toUnicode(config_name);
答案 1 :(得分:2)
你的意思是TCHAR *?因为将一个字符作为名称会有点奇怪。无论如何:只需将TCHAR转换为wchar_t - TCHAR可以是char或wchar_t,无论哪种方式保存为强制转换为wchar_t。
答案 2 :(得分:0)