繁体   English   中英

c++ 从 LPCTSTR 转换为 const char *

[英]c++ convert from LPCTSTR to const char *

我在 MSVC2008 MFC 中有这个问题。 我正在使用 unicode。 我有一个 function 原型:

MyFunction(const char *)

我称之为:

MyfunFunction(LPCTSTR wChar). 

错误:无法将参数 1 从“LPCTSTR”转换为“const char *”

如何解决?

由于您使用的是 MFC,因此您可以轻松地让 CString 进行从charTCHAR的自动转换:

MyFunction(CString(wChar));

无论您的原始字符串是基于char还是wchar_t ,这都有效。

编辑:看来我原来的答案与你所要求的相反。 轻松修复:

MyFunction(CStringA(wChar));

CStringACString的一个版本,它专门包含char字符,而不是TCHAR 还有一个CStringW包含wchar_t

LPCTSTR是指向const TCHAR的指针,而TCHARWCHARWCHAR很可能是wchar_t 如果可以的话,让你的 function 使用const wchar_t* ,或者手动创建一个const char*缓冲区,复制内容并传递它。

当为 MSVC 项目定义 UNICODE 时, LPCTSTR定义为const wchar_t * 只需更改 function 签名将不起作用,因为 function 中的任何代码使用输入参数都需要一个const char *

我建议您单独留下 function 签名; 而是在调用 function 之前调用转换 function(例如WideCharToMultiByte )来转换字符串。 如果您的 function 被多次调用,并且在每次调用之前添加转换太繁琐,请创建一个重载MyFunction(const wchar_t *wChar) 然后可以执行转换并使用结果调用原始版本。

在此示例中,我将 LPCTSTR 转换为 const char 指针和 char 指针。 这个转换需要包含windows.h和atlstr.h,希望对你有帮助。

// Required inclusions
#include <windows.h>
#include <atlstr.h>

// Code
LPCTSTR fileName = L"test.txt";
CStringA stringA(fileName);
const char* constCharP = stringA;
char* charP = const_cast<char*>(constCharP);

这可能不完全是主题,但我为我提出的wmain 框架编写了几个通用辅助函数,所以它们可能对某人有用。

确保调用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 -string。


如果你好奇,这里是框架的 rest:

#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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM