2010-07-28 6 views
0

J'ai du code dans une bibliothèque qui doit fonctionner en interne avec wstring, c'est très bien. Mais il est appelé avec un paramètre de chaîne TCHAR, à partir de projets unicode et non-unicode, et j'ai du mal à trouver une bonne conversion pour les deux cas.Convertir TCHAR * -> std :: wstring dans les environnements unicode et non-unicode

Je vois quelques conversions d'ATL et ainsi de suite, mais on ne voit pas la bonne façon, sans définir les chemins de code multiples en utilisant #define

Répondre

3

En supposant TCHAR se développe pour wchar_t en Unicode construit:

inline std::wstring convert2widestr(const wchar_t* const psz) 
{ 
    return psz; 
} 
inline std::wstring convert2widestr(const char* const psz) 
{ 
    std::size_t len = std::strlen(psz); 
    if(psz.empty()) return std::wstring(); 
    std::vector<wchar_t> result; 
    const int len = WideCharToMultiByte(CP_ACP 
            , 0 
            , reinterpret_cast<LPCWSTR>(psz) 
            , static_cast<int>(len) 
            , NULL 
            , 0 
            , NULL 
            , NULL 
            ); 

    result.resize(len); 
    if(result.empty()) return std::wstring(); 
    const int cbytes = WideCharToMultiByte(CP_ACP 
             , 0 
             , reinterpret_cast<LPCWSTR>(psz) 
             , static_cast<int>(len) 
             , reinterpret_cast<LPSTR>(&result[0]) 
             , static_cast<int>(result.size()) 
             , NULL 
             , NULL 
             ); 
    assert(cbytes); 
    return std::wstring(result.begin(), result.begin() + cbytes); 
} 

utilisation comme ceci:

void f(const TCHAR* psz) 
{ 
    std::wstring str = convert(psz); 
    // ... 
} 
+0

eeeeeeeeeeeeeew! Bien, bonne utilisation de la surcharge pour éviter '# define'. –

+0

CP_UTF8 est * très * peu probable dans les anciens programmes Windows. Utilisez plutôt CP_ACP. Ou utilisez simplement mbstowcs(). –

+0

@Hans: C'était une erreur copy'n'paste. ': (' – sbi