コード内で決定されたパラメーターを使用して、コード内で Windows プログラムを呼び出したいと思います。
外部の関数やメソッドを呼び出すのではなく、WinXP 環境内の実際の .exe またはバッチ/スクリプト ファイルを呼び出します。
C または C++ が優先言語ですが、他の言語 (ASM、C#、Python など) でより簡単に実行できる場合はお知らせください。
コード内で決定されたパラメーターを使用して、コード内で Windows プログラムを呼び出したいと思います。
外部の関数やメソッドを呼び出すのではなく、WinXP 環境内の実際の .exe またはバッチ/スクリプト ファイルを呼び出します。
C または C++ が優先言語ですが、他の言語 (ASM、C#、Python など) でより簡単に実行できる場合はお知らせください。
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)。
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
}
}
WindowsAPIでCreateProcess関数を探していると思います。実際には関連する呼び出しのファミリーがありますが、これはあなたが始めるのに役立ちます。とても簡単です。
これを行う最も簡単な方法の1つは、system()
ランタイムライブラリ関数を使用することです。1つの文字列をパラメーターとして受け取り(!よりもはるかに少ないパラメーターCreateProcess
)、コマンドラインで入力したかのように実行します。system()
また、プロセスが終了するのを自動的に待ってから戻ります。
制限もあります:
ランタイムライブラリは、Unixの遺産から派生し、プロセスをより細かく制御できる一連の関数(、、、、、、多かれ少なかれexec*
)も提供します。execl
execlp
execle
execv
execvp
最も低いレベルでは、Win32では、すべてのプロセスがCreateProcess
関数によって起動されるため、柔軟性が最も高くなります。