Синтаксический анализ аргументов командной строки Win32 API



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



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


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

675   9  

9 ответов:

Единственная поддержка, которую 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

    Ничего не найдено.