10

A.exe から B.exe にコマンド ライン引数を渡す必要があります。のような複数引数を持つ A.exe の場合

A.exe -a="a" -b="b"'

そして私は使用することができます

BeginProcess("B.exe", **args!**)

B.exe を起動します。次のような生のコマンドライン引数を取得するにはどうすればよいですか

'-a="a" -b="b"'

4

7 に答える 7

12

Windows を使用している場合は、GetCommandLineを使用して生のコマンド ラインを取得します。

GetCommandLine には argv[0] も含まれていることに注意してください。したがって、B に渡す前に、GetCommandLine の出力から argv[0] を超える必要があります。

これは、それを行うためのエラーチェックされていないコードです

#include <string.h>
#include <windows.h>
#include <iostream>
#include <ctype.h>

int main(int argc, char **argv)
{
    LPTSTR cmd  = GetCommandLine();

    int l = strlen(argv[0]);

    if(cmd == strstr(cmd, argv[0]))
    {
        cmd = cmd + l;
        while(*cmd && isspace(*cmd))
            ++cmd;
    }

    std::cout<<"Command Line is : "<<cmd;

}

上記のプログラムを として実行するとA.exe -a="a" -b="b"、次の出力が得られます

A.exe -a="a" -b="b"
Command Line is : -a="a" -b="b"
于 2013-01-04T02:53:27.553 に答える
1

argvシェルに入力された生の文字列は、プログラムの実行を開始する前に、シェルによってに変換されます。に加えて「生の」コマンドラインを提供するオペレーティングシステムやシェルについて聞いたことがありませんargv

ユーザーが引用符を使用してスペース文字を引数に渡した場合はどうなりますか?引用符内の引用符をエスケープするために円記号を使用した場合はどうなりますか?シェルが異なれば、引用ルールも異なる場合があります。

のようなリストがある場合はargv、実際の目標を補助するだけの文字列処理を実装しようとするのではなく、それを受け入れるAPIを見つけるようにしてください。Microsoftはセキュリティに真剣に取り組んでおり、アプリケーションにセキュリティホールを追加する必要のないものを確実に提供します。

C / C++APIに関するドキュメントが見つかりませんBeginProcess; これはWindowsだと思いますが、いずれにせよ、別のシステムコールについては、プラットフォームのリファレンスマニュアルを再確認する必要があります。

于 2013-01-04T03:01:52.690 に答える
1

の標準的な定義main

int main(int argc, char* argv[])

argv変数には、コマンドライン引数が含まれています。この変数は、配列内で使用さargcれているエントリの数を示します。argv

于 2013-01-04T02:46:43.550 に答える
0

これは、コマンドラインをシェル引数に戻す方法です。場合によっては、これを出力ファイルにエコーして、「使用された引数」を出力とともに保存すると便利です。エスケープは基本的なものであり、ほとんどの状況で十分です。

コマンド (i=0) で出力を開始しました。引数のみが必要な場合などは (i=1) に変更できます。

//you have to free() the result!, returns null if no args
char *arg2cmd(int argc, char** argv) {
    char *buf=NULL;
    int n = 0;
    int k, i;
    for (i=0; i <argc;++i) {
        int k=strlen(argv[i]);
        buf=( char *)realloc(buf,n+k+4);
        char *p=buf+n;
        char endq=0;
        // this is a poor mans quoting, which is good enough for anything that's not rediculous
        if (strchr(argv[i], ' ')) {
            if (!strchr(argv[i], '\'')) {
                *p++='\'';
                endq='\'';
            } else {
                *p++='\"';
                endq='\"';
            }
        }
        memcpy(p, argv[i], k);
        p+=k;
        if (i < (argc-1)) *p++=' ';
        if (endq) *p++=endq;
        *p='\0';
        n = p-buf;
    }
    return buf;
}

そして単純な cpp ラッパー:

std::string arg2string(int argc, char **argv) {
    char *tmp=arg2cmd(argc, argv);
    std::string ret=tmp;
    free(tmp);
    return ret;
}
于 2014-01-03T17:58:48.993 に答える