32

コード内で決定されたパラメーターを使用して、コード内で Windows プログラムを呼び出したいと思います。

外部の関数やメソッドを呼び出すのではなく、WinXP 環境内の実際の .exe またはバッチ/スクリプト ファイルを呼び出します。

C または C++ が優先言語ですが、他の言語 (ASM、C#、Python など) でより簡単に実行できる場合はお知らせください。

4

5 に答える 5

30

CreateProcess()、System() などを呼び出すときは、ファイル名や完全修飾パスにスペースが含まれている場合に備えて、ファイル名の文字列 (コマンド プログラムのファイル名を含む) を二重引用符で囲んでください。ファイル名のパスは、コマンド インタープリターによって個別の引数として解析されます。

system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");

Windows では、CreateProcess() を使用することをお勧めします。セットアップは面倒ですが、プロセスの起動方法をより細かく制御できます (Greg Hewgill の説明による)。WinExec() を使用することもできます。(system() は UNIX に移植可能です)。

バッチ ファイルを起動する場合、cmd.exe (または command.com) で起動する必要がある場合があります。

WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED);

(またはSW_SHOW_NORMAL、コマンド ウィンドウを表示する場合)。

Windows はシステム PATH で command.com または cmd.exe を検出する必要があるため、完全修飾する必要はありませんが、確実に使用したい場合は、完全修飾ファイル名を使用して構成できますCSIDL_SYSTEM(単純に C:\Windows を使用しないでください)。 \system32\cmd.exe)。

于 2009-01-28T03:42:15.413 に答える
12

C ++の例:

char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);

C#の例:

    private static void RunCommandExample()
    {
        // Don't forget using System.Diagnostics
        Process myProcess = new Process();

        try
        {
            myProcess.StartInfo.FileName = "executabletorun.exe";

            //Do not receive an event when the process exits.
            myProcess.EnableRaisingEvents = false;

            // Parameters
            myProcess.StartInfo.Arguments = "/user testuser /otherparam ok";

            // Modify the following to hide / show the window
            myProcess.StartInfo.CreateNoWindow = false;
            myProcess.StartInfo.UseShellExecute = true;
            myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;

            myProcess.Start();

        }
        catch (Exception e)
        {
            // Handle error here
        }
    }
于 2009-01-28T01:24:30.340 に答える
8

WindowsAPIでCreateProcess関数を探していると思います。実際には関連する呼び出しのファミリーがありますが、これはあなたが始めるのに役立ちます。とても簡単です。

于 2009-01-28T01:12:22.080 に答える
6

これを行う最も簡単な方法の1つは、system()ランタイムライブラリ関数を使用することです。1つの文字列をパラメーターとして受け取り(!よりもはるかに少ないパラメーターCreateProcess)、コマンドラインで入力したかのように実行します。system()また、プロセスが終了するのを自動的に待ってから戻ります。

制限もあります:

  • 起動されたプロセスのstdinとstdoutをあまり制御できません
  • 他のプロセスの実行中(強制終了の決定など)は、他に何もできません。
  • 他のプロセスを照会するために他のプロセスへのハンドルを取得することはできません

ランタイムライブラリは、Unixの遺産から派生し、プロセスをより細かく制御できる一連の関数(、、、、、、多かれ少なかれexec*)も提供します。execlexeclpexecleexecvexecvp

最も低いレベルでは、Win32では、すべてのプロセスがCreateProcess関数によって起動されるため、柔軟性が最も高くなります。

于 2009-01-28T01:19:27.200 に答える