Как конвертировать argv в широкие символы в приложении командной строки Win32? - PullRequest
3 голосов
/ 07 сентября 2011

Я использую Win32 API для C в моей программе, чтобы читать с последовательного порта, это кажется довольно низким уровнем.Предполагая, что нет лучшего способа чтения с последовательного порта, функция CreateFile включает аргумент LPCWSTR, который я прочитал, и похоже, что LPCWSTR является типом wchar_t.Во-первых, я не очень понимаю разницу между wchar и char, я читал материал об ansi и unicode, но я не знаю, как это применимо к моей ситуации.

Моя программа использует функцию main, а не wmain, и ей необходимо получить аргумент из командной строки и сохранить его в переменной wchar_t.Теперь я знаю, что мог бы сделать это, если бы просто сделал строку на месте;

wchar_t variable[1024];
swprintf(variable,1024,L"%s",L"randomstringETC");

Потому что похоже, что L преобразует массивы char в массивы wchar.Однако это не работает, когда я это делаю;

wchar_t variable[1024];
swprintf(variable,1024,L"%s",Largv[1]);

, очевидно, потому что это синтаксическая ошибка.Я предполагаю, что мой вопрос, есть ли простой способ конвертировать нормальные строки в строки wchar_t?

Или есть способ полностью избежать этой вещи в Юникоде и читать из последовательного интерфейса другим способом, используя C на Windows ..

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Нет функции winapi с именем CreateFile.Есть CreateFileW и CreateFileA.CreateFile - это макрос , который отображается на одну из этих реальных функций в зависимости от того, определен макрос _UNICODE.CreateFileW принимает LPCWSTR (он же const wchar_t *), CreateFileA принимает LPCSTR (он же const char *).

Если вы еще не готовы перейти на Unicode, просто используйте функцию CreateFileA () явно.Или измените настройки проекта: Project + Properties, General, Character Set.Существует ненулевая стоимость, базовая операционная система полностью основана на Unicode.Таким образом, CreateFileA () проходит через слой перевода, который превращает const char * в const wchar_t * в соответствии с текущей системной кодовой страницей.

1 голос
/ 07 сентября 2011

L вещь только для строковых литералов.

Вам нужно преобразовать строку argv (предположительно, unsigned char) в wchar, используя что-то вроде функции winapi mbstowcs().

1 голос
/ 07 сентября 2011

MultiByteToWideChar может использоваться для отображения из ANSI в UNICODE.Чтобы сделать вызов swprintf, вам нужно определить массив wchar, например:

WCHAR lala[256] = {0};
swprintf(lala, _countof(lala), L"%s", Largv[1]);

Можно избежать unicode, компилируя ваше приложение с многобайтовым набором символов, но это плохая практикаделайте это, если вы не делаете это по наследственным причинам.В любом случае Windows потребуется преобразовать его обратно в юникод в какой-то момент, так как это кодировка базовой ОС.

...