2011-12-21 4 views
1

こんにちは私のプロジェクトでは、ダイアログボックスの名前(wchar_t型)と構成の名前(TCHAR型)を連結する必要があります。 どうすればいいですか?ありがとう。 wchar_tとTCHARを連結する

答えて

4

これが依存、TCHARはcharまたはwchar_tエーテルでありますあなたのアプリケーションをUnicodeとして構築するかどうかによって異なります。あなたがUnicodeとしてあなたのアプリケーションを構築する場合は、単純に行うことができます。

wcscat_s(dest, extra); 

あなたがUnicodeとしてアプリケーションを構築していない場合は、TCHARの文字列を変換するか必要があります。その後、charの文字列であるS(:Sを)をwchar_t:sまたはwchar_tの文字列に変換します。文字列はcharです。これを行うには、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; 
    } 
}; 

とAN wchar_t(私は抜粋として残す)とほぼ同じインスタンスです。あなたの場合、単純に次のようにすることができます:

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

もちろん、過去10年間に構築されたアプリケーションは、おそらくUnicodeとして構築する必要があります。これはかなり簡単な作業です。 :-) –

+0

ありがとう、私はwcscat_s(dest、extra)を使用しました。それは動作しますTCHARはwcharであり、私はユニコードで私のプロジェクトを構築します:) – nidhal

+0

@CodyGray:うん、しかし、あなたのコードUTF-16を作ることは、それが常に動作することを確認したい場合は十分ではありません。 UTF-16のコードポイントは実際に複数の「wchar_t」にまたがることができます。 –

2

あなたはTCHAR *を意味しますか?なぜなら、名前として単一の文字を持つことはちょっと変わってしまうからです。とにかく:TCHARをwchar_tにキャストしてください。TCHARはcharまたはwchar_tのいずれかです。wchar_tにキャストするために保存されています。

http://msdn.microsoft.com/en-us/library/cc842072.aspx

関連する問題