Подтвердить что ты не робот

Разбор аргументов командной строки Win32 API

Я пишу консольное приложение Win32, которое можно запустить с дополнительными аргументами вроде этого:

app.exe /argName1:"argValue" /argName2:"argValue"

Нужно ли вручную анализировать его (чтобы определить, какие аргументы присутствуют) из переменных argc/argv или API Win32 содержит парсер аргументов?

4b9b3361

Ответ 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 варианты), включенные в стандартную библиотеку времени исполнения.

Ответ 6

Я разрабатываю и использую Libparamset, написанный на простом C. Он действительно мощный и хорошо работает в Windows. Это обеспечивает:

  • Является межплатформенным.
  • Поддержка подстановочных знаков для ввода файлов в Windows!
  • Мощные функции. См. Libparamset.

Ответ 7

Я не считаю, что есть доступный API Win32. Вы можете искать реализацию Windows getopt или другую библиотеку.

Ответ 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 не заботится:

  • Сколько "-" предшествует вашей опции;
  • Какие флаги и опции вы поддерживаете - это ваша ответственность;
  • Проверка синтаксиса: любая командная строка является действительной (не обязательно уникальной) комбинацией позиционных параметров, флагов и опции;
  • Автоматическое создание сообщения об использовании.