Parsing von Win32-API-Befehlszeilenargumenten

Lesezeit: 4 Minuten

Benutzer-Avatar
Tomas

Ich schreibe eine Win32-Konsolenanwendung, die mit optionalen Argumenten wie folgt gestartet werden kann:

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

Muss ich es manuell analysieren (um festzustellen, welche Argumente vorhanden sind) aus argc/argv-Variablen, oder enthält die Win32-API einige Argumente-Parser?

  • note.sonots.com/Comp/CompLang/cpp/getopt.html

    – Prof. Falken

    2. Oktober 2012 um 11:22 Uhr

  • Siehe die Dokumentation von WinMainkommen die Befehlszeilenparameter als einzelne Zeichenfolge und nicht als argv/argc (obwohl Sie es in diesem Format durch eine andere Funktion erhalten können).

    – Ludin

    2. Oktober 2012 um 11:23 Uhr

Benutzer-Avatar
Liho

Es gibt keine Win32-Unterstützung für Parsing Kommandozeilenargumente.

Siehe verwandte Artikel bei MSDN:
Analysieren von C++-Befehlszeilenargumenten
Argumentdefinitionen
Anpassen der C++-Befehlszeilenverarbeitung

Siehe auch ähnliche Fragen:
Welche Parameter-Parser-Bibliotheken gibt es für C++?
Parsing von Parametern zu main()
Option Parser für C/C++?
Was ist eine effektive Methode zum Analysieren von Befehlszeilenparametern in C++?

Die einzige Unterstützung, die Win32 für Befehlszeilenargumente bereitstellt, sind die Funktionen GetCommandLine und CommandLineToArgvW. Dies ist genau das gleiche wie die argv Parameter, den Sie für eine Konsolenanwendung haben.

Sie müssen das Parsing selbst durchführen. Regex wäre dafür eine gute Option.

Sie könnten mit verschiedenen Bibliotheken und anderem herumspielen … Aber manchmal brauchen Sie nur etwas Einfaches, Praktisches und Schnelles:

int i;
char *key, *value;

for( i = 1; i <= argc; i++ ) {
    if( *argv[i] == "https://stackoverflow.com/" ) {
        key = argv[i] + 1;
        value = strchr(key, ':');
        if( value != NULL ) *value++ = 0;
        process_option( key, value );
    } else {
        process_value( argv[i] );
    }
}

Du hast die Idee…

Dies setzt eine normale Win32-Konsolen-App voraus, wie Sie angedeutet haben (die eine traditionelle main Funktion). Für Win32-Apps kommen Sie ins Spiel WinMain stattdessen, wie eine andere Person bereits kommentiert hat.

  • Wenn Sie die mit Visual Studio gelieferte CRT verwenden, haben Sie Zugriff auf die Befehlszeilenargumente über die __argc, __argv, __wargv Symbole. Sie werden auch für Anwendungen aufgefüllt, die im WINDOWS-Subsystem ausgeführt werden. Verwenden Sie alternativ den Windows-API-Aufruf CommandLineToArgvW um den Rückgabewert von zu analysieren GetCommandLineW.

    – Inspektionsfähig

    10. Oktober 2017 um 7:32 Uhr

Nur fürs Protokoll, wenn Sie es verwenden GCC von MinGWanstelle von MSVC von Microsoft, erhalten Sie GNU getopt (das auch die Varianten getopt_long und getopt_long_only enthält), das in der Standard-Laufzeitbibliothek enthalten ist.

Sie können die Argumente mit parsen GetCommandLine, PathRemoveArgs, PathGetArgs in einer Schleife

https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs.85).aspx

  • Spröde, bestenfalls. Von dem Dokumentation: “Diese Funktion sollte nicht für generische Befehlspfadvorlagen (von Benutzern oder der Registrierung) verwendet werden, sondern nur für Vorlagen, von denen die Anwendung weiß, dass sie wohlgeformt sind.” Es ist einfacher und sicherer zu verwenden CommandLineToArgvW stattdessen.

    – Inspektionsfähig

    10. Oktober 2017 um 7:28 Uhr

Ich habe entwickelt und verwendet libparamset das in einfachem C geschrieben ist. Es ist wirklich mächtig und funktioniert gut unter Windows. Es bietet:

  • Ist plattformübergreifend.
  • Wildcard-Unterstützung für die Dateieingabe unter Windows!
  • Leistungsstarke Funktionen. Sehen libparamset.

  • Spröde, bestenfalls. Von dem Dokumentation: “Diese Funktion sollte nicht für generische Befehlspfadvorlagen (von Benutzern oder der Registrierung) verwendet werden, sondern nur für Vorlagen, von denen die Anwendung weiß, dass sie wohlgeformt sind.” Es ist einfacher und sicherer zu verwenden CommandLineToArgvW stattdessen.

    – Inspektionsfähig

    10. Oktober 2017 um 7:28 Uhr

Benutzer-Avatar
Adi Shavit

Wenn Ihre Bedürfnisse einfach sind, sollten Sie einen Blick darauf werfen Argh!.
Es ist ein einzelner Header und super einfach zu bedienen:

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;
}

Indem es unaufdringlich ist, übernimmt es Sie nicht main() Funktion.

Aus der Readme:

Philosophie

Im Gegensatz zu vielen Alternativen argh nimmt einen Minimalisten Laissez-faire Ansatz, sehr geeignet für unkompliziertes Prototyping mit den folgenden Regeln:

Die API ist:

  • Minimalistisch aber ausdrucksstark:
    • Keine Getter oder Binder
    • Nur die [] und () Betreiber.
    • Einfache Iteration (Bereich-for zu).
  • Sie zahlen nicht für das, was Sie nicht nutzen;
  • Die Konvertierung in typisierte Variablen erfolgt (via std::istream >>) auf der Benutzerseite nach die Parsing-Phase;
  • Bei Fehlern werden keine Ausnahmen ausgelöst.
  • Liberale BSD-Lizenz;
  • Einzelne Header-Datei;
  • Nein nicht-std Abhängigkeiten.

argh kümmert sich nicht um:

  • Wie viele ‘-‘ Ihrer Option vorangestellt;
  • Welche Flaggen und Optionen Sie unterstützen – das liegt in Ihrer Verantwortung;
  • Syntaxvalidierung: irgendein Befehlszeile ist ein gültiges (nicht unbedingt einzigartig) Kombination aus positionellen Parameter, Flaggen und
    Optionen;
  • Automatische Erstellung einer Nutzungsmeldung.

1137240cookie-checkParsing von Win32-API-Befehlszeilenargumenten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy