Конвертировать TCHAR * -> std :: wstring как в юникодной, так и в не-юникодной среде - PullRequest
0 голосов
/ 28 июля 2010

У меня есть некоторый код в библиотеке, который должен внутренне работать с wstring, это все хорошо. Но он вызывается со строковым параметром TCHAR из проектов как в Юникоде, так и не в Юникоде, и у меня возникают проблемы с поиском аккуратного преобразования для обоих случаев.

Я вижу некоторые преобразования ATL и т. Д., Но не вижу правильного пути без определения нескольких путей кода с помощью #define

1 Ответ

3 голосов
/ 28 июля 2010

Предполагается, что TCHAR увеличивается до wchar_t в сборках Unicode:

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 );
}

Используйте вот так:

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