Разбор аргументов командной строки Win32 API
Я пишу консольное приложение Win32, которое можно запустить с дополнительными аргументами вроде этого:
app.exe /argName1:"argValue" /argName2:"argValue"
Нужно ли вручную анализировать его (чтобы определить, какие аргументы присутствуют) из переменных argc/argv или API Win32 содержит парсер аргументов?
Ответы
Ответ 1
Нет поддержки Win32 для аргументов командной строки синтаксического анализа.
См. связанные статьи в MSDN:
Разбор аргументов командной строки на С++
Определения аргументов
Настройка обработки командной строки С++
также рассмотрите похожие вопросы:
Какие библиотеки парсеров для анализа существуют для С++?
Параметры анализа для main()
Опционные парсеры для C/С++?
Каков эффективный способ анализа параметров командной строки на С++?
...
Ответ 2
Единственной поддержкой, которую Win32 предоставляет для аргументов командной строки, являются функции GetCommandLine
и CommandLineToArgvW
. Это точно так же, как параметр argv
, который у вас есть для консольного приложения.
Вам нужно будет разобрать парсинг. Regex был бы хорошим вариантом для этого.
Ответ 3
Вы можете общаться с различными библиотеками и т.д. Но иногда все, что вам нужно, это что-то простое, практичное и быстрое:
int i;
char *key, *value;
for( i = 1; i <= argc; i++ ) {
if( *argv[i] == '/' ) {
key = argv[i] + 1;
value = strchr(key, ':');
if( value != NULL ) *value++ = 0;
process_option( key, value );
} else {
process_value( argv[i] );
}
}
Вы получаете идею...
Это предполагает обычное консольное приложение Win32, как вы подразумевали (у которого есть традиционная функция main
). Для приложений Win32 вы заходите на WinMain
, а другой человек уже прокомментировал.
Ответ 4
Только для записи, если вы используете MinGW GCC, а не Microsoft MSVC, вы получаете GNU getopt (который также включает getopt_long и getopt_long_only варианты), включенные в стандартную библиотеку времени исполнения.
Ответ 5
Вы можете проанализировать аргументы, используя GetCommandLine, PathRemoveArgs, PathGetArgs
в цикле
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs.85).aspx
Ответ 6
Я разрабатываю и использую Libparamset, написанный на простом C. Он действительно мощный и хорошо работает в Windows. Это обеспечивает:
- Является межплатформенным.
- Поддержка подстановочных знаков для ввода файлов в Windows!
- Мощные функции. См. Libparamset.
Ответ 7
Я не считаю, что есть доступный API Win32. Вы можете искать реализацию Windows getopt или другую библиотеку.
Ответ 8
Не уверен в существовании такой функции win32 api, но библиотека Boost.Program_Options могла бы помочь вам.
Ответ 9
Если ваши потребности просты, вы можете взглянуть на Argh!.
Это одиночный заголовок и супер простой в использовании:
int main(int, char* argv[])
{
argh::parser cmdl(argv); // declare
if (cmdl[{ "-v", "--verbose" }]) // use immediately
std::cout << "Verbose, I am.\n";
return EXIT_SUCCESS;
}
Будучи неинтрузивным, он не возьмет на себя функцию main()
.
Из Readme:
Философия
Вопреки многим альтернативам, argh
использует минималистский подход laissez-faire, очень подходящий для беспроблемного прототипирования со следующими правилами:
API:
- Минималистичный, но выразительный:
- Нет получателей и вложений.
- Просто операторы
[]
и ()
. - Простая итерация (диапазон -
for
).
- Вы не платите за то, что не используете;
- Преобразование в типизированные переменные происходит (через
std::istream >>
) на стороне пользователя после фазы синтаксического анализа; - Никаких исключений, вызванных сбоями.
- Либеральная лицензия BSD;
- Отдельный заголовочный файл;
- Нет зависимостей < <27 > .
argh
не заботится:
- Сколько "
-
" предшествует вашей опции; - Какие флаги и опции вы поддерживаете - это ваша ответственность;
- Проверка синтаксиса: любая командная строка является действительной (не обязательно уникальной) комбинацией позиционных параметров, флагов и опции;
- Автоматическое создание сообщения об использовании.