2011-12-21 28 views
1

嗨,我需要在我的项目中concat我的对话框的名称(类型wchar_t)和配置的名称(类型TCHAR)。 我该怎么做? 谢谢。concat一个wchar_t和TCHAR

回答

4

这取决于,一个TCHAR是醚charwchar_t取决于您是否将您的应用程序构建为Unicode。如果你建立你的应用程序为Unicode,你可以简单地做:

wcscat_s(dest, extra); 

如果不建立自己的应用程序为Unicode,你需要或者转换成TCHAR串:S(它是那么的char字符串:■ )转换为一个字符串wchar_t:s或您的字符串wchar_t:s转换为字符串char:s。要做到这一点,你应该看看MultiByteToWideCharWideCharToMultiByte函数。这两个参数看起来都有些吓人,并且需要很多参数,所以我通常会使用一些帮助程序(请注意,为了清楚起见,正确的错误处理已被删除,一个正确的解决方案也会在一个循环中调用上述函数,缓冲如果调用失败,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(我作为excerise离开)几乎完全相同。在你的情况下,你可以简单地做:

std::wstring result = dialog_name + string_converter_t<TCHAR>::toUnicode(config_name); 
+0

当然,任何建立在过去十年的应用程序可能应该建立为Unicode,所以这是一个非常简单的任务。 :-) – 2011-12-21 09:56:28

+0

谢谢,我用wcscat_s(dest,extra);它的工作原理TCHAR是一个wchar,我用unicode建立我的项目:) – nidhal 2011-12-21 09:56:36

+0

@CodyGray:是的,但只是让你的代码UTF-16是不够的,如果你想确保它始终工作。 UTF-16中的代码点实际上可以跨越多个“wchar_t”,这是少数人考虑的因素(包括我在内)。 – 2011-12-22 11:22:52