Concat a wchar_t и TCHAR - PullRequest
       2

Concat a wchar_t и TCHAR

1 голос
/ 21 декабря 2011

Привет! Мне нужно в моем проекте объединить имя моего диалогового окна (тип wchar_t) и имя конфигурации (тип TCHAR).Как я могу это сделать?спасибо.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

Это зависит от того, является ли 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);
2 голосов
/ 21 декабря 2011

Ты имеешь в виду ЧАР *?Потому что было бы странно иметь один символ в качестве имени.В любом случае: просто приведите TCHAR к wchar_t - TCHAR это либо char, либо wchar_t, в любом случае это сохранение для приведения к wchar_t.

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

0 голосов
/ 21 декабря 2011

Этот вопрос похож на этот: Невозможно преобразовать из 'const wchar_t *' в '_TCHAR *'

Чтобы манипулировать различными типами символов вручную, взгляните на это: http://www.codeproject.com/KB/TipsnTricks/StringManipulations.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...