C ++ конвертировать из LPCTSTR в const char * - PullRequest
4 голосов
/ 05 июля 2011

У меня есть эта проблема в MSVC2008 MFC.Я использую Unicode.У меня есть прототип функции:

MyFunction(const char *)

, и я вызываю его:

MyfunFunction(LPCTSTR wChar). 

ошибка: невозможно преобразовать параметр 1 из LPCTSTR в const char *

Как решить?

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

Поскольку вы используете MFC, вы можете легко позволить CString выполнить автоматическое преобразование из char в TCHAR:

MyFunction(CString(wChar));

. Это работает независимо от того, является ли ваша исходная строка char или * 1007.* На основании.

Редактировать: Кажется, мой первоначальный ответ был противоположен тому, что вы просили.Легко исправить:

MyFunction(CStringA(wChar));

CStringA - это версия CString, которая содержит char символов, а не TCHAR.Также есть CStringW, который содержит wchar_t.

2 голосов
/ 05 июля 2011

Когда UNICODE определен для проекта MSVC LPCTSTR определяется как const wchar_t *; простое изменение сигнатуры функции не будет работать, потому что любой код внутри функции, использующий входной параметр, ожидает const char *.

Я бы посоветовал вам оставить подпись функции в покое; вместо этого вызовите функцию преобразования, такую ​​как WideCharToMultiByte, чтобы преобразовать строку перед вызовом вашей функции. Если ваша функция вызывается несколько раз, и добавление преобразования перед каждым вызовом слишком утомительно, создайте перегрузку MyFunction(const wchar_t *wChar). Затем можно выполнить преобразование и вызвать исходную версию с результатом.

2 голосов
/ 05 июля 2011

LPCTSTR - указатель на const TCHAR, TCHAR - WCHAR и WCHAR, наиболее вероятно, wchar_t. Сделайте так, чтобы ваша функция взяла const wchar_t*, если вы можете, или вручную создайте буфер const char*, скопируйте содержимое и передайте его.

1 голос
/ 06 июля 2011

Это может быть не совсем по теме, но я написал несколько общих вспомогательных функций для моей предложенной wmain framework , так что, возможно, они кому-нибудь пригодятся.

Убедитесь, что вы набрали std::setlocale(LC_CTYPE, ""); в вашем main(), прежде чем делать какие-либо трудные вещи!

#include <string>
#include <vector>
#include <clocale>
#include <cassert>

std::string get_locale_string(const std::wstring & s)
{
  const wchar_t * cs = s.c_str();
  const size_t wn = wcsrtombs(NULL, &cs, 0, NULL);

  if (wn == size_t(-1))
  {
    std::cout << "Error in wcsrtombs(): " << errno << std::endl;
    return "";
  }

  std::vector<char> buf(wn + 1);
  const size_t wn_again = wcsrtombs(&buf[0], &cs, wn + 1, NULL);

  if (wn_again == size_t(-1))
  {
    std::cout << "Error in wcsrtombs(): " << errno << std::endl;
    return "";
  }

  assert(cs == NULL); // successful conversion

  return std::string(&buf[0], wn);
}

std::wstring get_wstring(const std::string & s)
{
  const char * cs = s.c_str();
  const size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);

  if (wn == size_t(-1))
  {
    std::cout << "Error in mbsrtowcs(): " << errno << std::endl;
    return L"";
  }

  std::vector<wchar_t> buf(wn + 1);
  const size_t wn_again = mbsrtowcs(&buf[0], &cs, wn + 1, NULL);

  if (wn_again == size_t(-1))
  {
    std::cout << "Error in mbsrtowcs(): " << errno << std::endl;
    return L"";
  }

  assert(cs == NULL); // successful conversion

  return std::wstring(&buf[0], wn);
}

Вы можете предоставить "фиктивные" перегрузки:

inline std::string get_locale_string(const std::string & s) { return s; }
inline std::wstring get_wstring(const std::wstring & s) { return s; }

Теперь, если у вас есть LPCTSTR x, вы всегда можете позвонить get_locale_string(x).c_str(), чтобы получить char -струну.


Если вам интересно, вот остальные рамки:

#include <vector>

std::vector<std::wstring> parse_args_from_char_to_wchar(int argc, char const * const argv[])
{
  assert(argc > 0);

  std::vector<std::wstring> args;
  args.reserve(argc);

  for (int i = 0; i < argc; ++i)
  {
    const std::wstring arg = get_wstring(argv[i]);
    if (!arg.empty()) args.push_back(std::move(arg));
  }

  return args;
}

Теперь main() - ваша новая точка входа всегда int wmain(const std::vector<std::wstring> args):

#ifdef WIN32

#include <windows.h>

extern "C" int main()
{
  std::setlocale(LC_CTYPE, "");

  int argc;
  wchar_t * const * const argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);

  return wmain(std::vector<std::wstring>(argv, argv + argc));
}

#else // WIN32

extern "C" int main(int argc, char *argv[])
{
  LOCALE = std::setlocale(LC_CTYPE, "");

  if (LOCALE == NULL)
  {
    LOCALE = std::setlocale(LC_CTYPE, "en_US.utf8");
  }

  if (LOCALE == NULL)
  {
    std::cout << "Failed to set any reasonable locale; not parsing command line arguments." << std::endl;
    return wmain(std::vector<std::wstring>());
  }

  std::cout << "Locale set to " << LOCALE << ". Your character type has "
            << 8 * sizeof(std::wstring::value_type) << " bits." << std::endl;

  return wmain(parse_args_from_char_to_wchar(argc, argv));
}

#endif
...