Синтаксический анализ аргументов командной строки Win32 API
Я пишу консольное приложение Win32, которое можно запустить с дополнительными аргументами, такими как:
app.exe /argName1:"argValue" /argName2:"argValue"
Должен ли я анализировать его вручную (чтобы иметь возможность определить, какие аргументы присутствуют) из переменных argc/argv, или Win32 API содержит некоторые аргументы парсера?
9 ответов:
Нет поддержки Win32 длясинтаксического анализа аргументов командной строки.
Смотрите соответствующие статьи на сайте MSDN:
синтаксический анализ аргументов командной строки C++
определения аргументов
настройка обработки командной строки C++Также посмотрите на подобные вопросы:
какие библиотеки парсеров параметров существуют для C++?
парсинг параметров в main()
Парсеры опций для C / C++?
Что такое эффективный способ разбора параметры командной строки в C++?
...
Единственная поддержка, которую Win32 предоставляет для аргументов командной строки, - это функции
GetCommandLineиCommandLineToArgvW. Это в точности совпадает с параметромargv, который используется для консольного приложения.Разбор придется делать самому. Регулярное выражение было бы хорошим вариантом для этого.
Вы можете возиться с различными библиотеками и прочим... Но иногда все, что вам нужно, - это что-то простое, практичное и быстрое:
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вместо этого, как уже прокомментировал другой человек.
Просто для записи, если вы используете GCC MinGW, а не MSVC Microsoft, вы получаете GNU getopt, (который также включает варианты getopt_long и getopt_long_only), включенные в стандартную библиотеку времени выполнения.
Вы можете проанализировать аргументы, используя
GetCommandLine, PathRemoveArgs, PathGetArgsв a loop
https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs. 85).aspx
Я разрабатываю и использую libparamset, написанный на простом языке C. Он действительно мощный и хорошо работает на Windows. Он обеспечивает:
- является кроссплатформенной.
- Поддержка подстановочных знаков для ввода файлов в Windows!
- мощные функции. Смотрите libparamset.
Я не верю, что существует API Win32. Вы можете найти Windows-реализациюgetopt или другую библиотеку.
Не уверен в существовании такой функции win32 api, но Boost.Библиотека Program_Options может вам помочь.
Если ваши потребности просты, вы можете взглянуть на тьфу!.
Это один заголовок и очень проста в использовании:Будучи неинтрузивным, он не берет на себя вашу функцию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;
- один заголовок файл;
- Нет не-
stdзависимостей.
arghне заботится о:
- сколько '
-' предшествовало вашему выбору;- какие флаги и опции вы поддерживаете - это ваша ответственность;
- проверка синтаксиса: любая командная строка является допустимой (необязательно уникальной) комбинацией позиционных параметров, флаги и варианты;
- автоматическое создание использования сообщение.
Comments