web-dev-qa-db-ja.com

Win32APIコマンドライン引数の解析

私はWin32コンソールアプリケーションを書いています。これは次のようなオプションの引数で開始できます。

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

Argc/argv変数から手動で解析する必要がありますか(どの引数が存在するかを判別できるようにするため)、またはWin32 APIにはいくつかの引数パーサーが含まれていますか?

16
tomas
14
LihO

Win32がコマンドライン引数に対して提供する唯一のサポートは、関数GetCommandLineおよびCommandLineToArgvWです。これは、コンソールアプリケーション用のargvパラメーターとまったく同じです。

自分で解析を行う必要があります。正規表現はこれに適したオプションです。

8
Superman

さまざまなライブラリなどをいじくり回すことができます...しかし、必要なのは、シンプルで実用的で迅速なものだけである場合もあります。

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

あなたはアイデアを得る...

これは、(従来のmain関数を備えた)通常のWin32コンソールアプリを想定しています。 Win32アプリの場合、別の人がすでにコメントしているので、代わりにWinMainにアクセスします。

4
paddy

私はプレーンCで書かれた libparamset を開発して使用しています。これは非常に強力で、Windowsでうまく機能します。それは提供します:

  • クロスプラットフォームです。
  • Windowsでのファイル入力のワイルドカードサポート!
  • 強力な機能。 libparamset を参照してください。
2
Taavi Valjaots

念のため、MicrosoftのMSVCではなく MinGWのGCC を使用すると、GNU getopt、(getopt_longおよびgetopt_long_onlyバリアントも含まれます)が含まれます。標準のランタイムライブラリ。

2
Keith Marshall

ループでGetCommandLine, PathRemoveArgs, PathGetArgsを使用すると、引数を解析できます

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

2
zarafsha123

ニーズが単純な場合は、 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 >>_を介して)行われますafter解析フェーズ。
  • 失敗に対してスローされる例外はありません。
  • リベラルBSDライセンス;
  • 単一のヘッダーファイル。
  • std以外の依存関係はありません。

arghは気にしません:

  • オプションの前にある「_-_」の数。
  • どのフラグとオプションをサポートするか-それはあなたの責任です。
  • 構文の検証:anyコマンドラインは、位置パラメータフラグおよび-の有効な(必ずしも一意ではない)組み合わせです。 オプション;
  • 使用状況メッセージを自動的に生成します。
1
Adi Shavit

Win32APIが利用できるとは思いません。 getopt または別のライブラリのWindows実装を探すことができます。

0
kgiannakakis

そのようなwin32api関数の存在についてはわかりませんが、 Boost.Program_Options ライブラリが役立つ可能性があります。

0
usta