C++ конвертировать из LPCTSTR в const char *
У меня есть эта проблема в MSVC2008 MFC. Я использую Unicode. У меня есть прототип функции:
MyFunction(const char *)
и я это называю
MyfunFunction(LPCTSTR wChar).
ошибка: невозможно преобразовать параметр 1 из LPCTSTR в const char *
Как это решить?
4 ответа
Поскольку вы используете MFC, вы можете легко позволить CString выполнить автоматическое преобразование из char
в TCHAR
:
MyFunction(CString(wChar));
Это работает, если ваша оригинальная строка char
или же wchar_t
основан.
Изменить: Кажется, мой первоначальный ответ был противоположен тому, что вы просили. Легко исправляется:
MyFunction(CStringA(wChar));
CStringA
это версия CString
что конкретно содержит char
персонажи, а не TCHAR
, Там также есть CStringW
который держит wchar_t
,
Когда UNICODE определен для проекта MSVC LPCTSTR
определяется как const wchar_t *
; простое изменение сигнатуры функции не будет работать, потому что любой код внутри функции, использующий входной параметр, ожидает const char *
,
Я бы посоветовал вам оставить подпись функции в покое; вместо этого вызовите функцию преобразования, такую как WideCharToMultiByte
преобразовать строку перед вызовом вашей функции. Если ваша функция вызывается несколько раз, и добавление преобразования перед каждым вызовом слишком утомительно, создайте перегрузку MyFunction(const wchar_t *wChar)
, Затем можно выполнить преобразование и вызвать исходную версию с результатом.
LPCTSTR
это указатель на const TCHAR
а также TCHAR
является WCHAR
а также WCHAR
наиболее вероятно wchar_t
, Заставь свою функцию взять const wchar_t*
если вы можете, или вручную создать const char*
буфер, скопируйте содержимое и передайте это.
Это может быть не совсем по теме, но я написал несколько общих вспомогательных функций для моей предлагаемой среды 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.
Если вам интересно, вот остальные рамки:
#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
В этом примере я преобразовываю LPCTSTR в указатель const char и указатель char. Для этого преобразования вам нужно включить windows.h и atlstr.h, я надеюсь вам помочь.
// Inclusions required
#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);