2

CreateProcessを使用してWin32の子コマンド実行コードを記述しました。

  CreateProcessW(NULL, // app
                 &commandW[0], // command line
                 NULL, // process security attributes
                 NULL, // primary thread security attributes
                 TRUE, // handles are inherited
                 0, // creation flags
                 NULL, // use parent's environment
                 NULL, // use parent's current directory
                 &startup_info, // STARTUPINFOW pointer
                 &process_info); // receives PROCESS_INFORMATION

これは「トリック」を使用し、コマンド全体を2番目の引数に入れます。これには通常、プログラムに渡される引数のみが含まれます。私はPOSIXに対して同じことをしたいのですが、同じ「トリック」は関数ではexeclp機能しません(そして他のすべてにも賭けます)。まだシングルstd::string commandを使用してプロセスを開始する方法はありますか?コマンドを実行可能ファイル名と引数に分割することは可能ですが、可能であれば多くの作業を避けたいと思います。

4

1 に答える 1

1

シェルを呼び出して、大きな文字列をシェルに渡し、シェルに処理させることができます。自分で試してみてください:

sh -c "echo 'hello world'"

(つまり、" -c" と、コマンドと引数を含む大きな文字列の 2 つの引数を渡します)

さらに良いことに、最初のコマンドexecを作成します。これにより、新しいプロセスが生成されたシェルを「置換」し、シェルを使用して起動されたことを誰も知りません。

@ecatmur のコメントで指摘されているように、これはsystem呼び出しの正確な機能です。

しかし、あなたは潜在的な (深刻な) 問題に直面しています: 文字の引用とエスケープに対処しなければなりません。シェルは、エスケープされていない限り、特殊文字を解釈できます (また解釈します)。スペースを含む引数は、適切に引用符で囲む必要があります。

Unix ライクなオペレーティング システムが引数を処理するのには理由があります。

私の意見では、Windows の方法には根本的な欠陥があります。複雑な文字列をコマンド ライン引数として他のプログラムに渡すことができないのは、重大な設計上の見落としです。

于 2012-09-20T14:12:30.640 に答える