サーチ…


CreateProcess

次の関数は、 CreateProcess Windows APIを使用して他のプログラムを起動するコードをカプセル化します。

これは設定可能で、呼び出しプロセスが終了するか、すぐに戻るまで待つことができます。

パラメーター:

  • FileName - 実行可能ファイルへのフルパス
  • Params - コマンドラインパラメータまたは空の文字列を使用する
  • Folder - 呼び出されたプログラムの作業フォルダ - 空のパスがFileNameから抽出される場合
  • WaitUntilTerminated - trueの場合、関数はプロセスの実行が完了するまで待機する
  • WaitUntilIdle - trueの場合、関数はWaitForInputIdle関数を呼び出し、指定されたプロセスが初期入力の処理を完了し、ユーザー入力が保留されなくなるまで待機する
  • RunMinimized - 真のプロセスが最小化されて実行される場合
  • ErrorCode - 関数が失敗すると、これにはWindowsエラーコードが含まれます
function ExecuteProcess(const FileName, Params: string; Folder: string; WaitUntilTerminated, WaitUntilIdle, RunMinimized: boolean;
  var ErrorCode: integer): boolean;
var
  CmdLine: string;
  WorkingDirP: PChar;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  Result := true;
  CmdLine := '"' + FileName + '" ' + Params;
  if Folder = '' then Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  if RunMinimized then
    begin
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
    end;
  if Folder <> '' then WorkingDirP := PChar(Folder)
  else WorkingDirP := nil;
  if not CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, WorkingDirP, StartupInfo, ProcessInfo) then
    begin
      Result := false;
      ErrorCode := GetLastError;
      exit;
    end;
  with ProcessInfo do
    begin
      CloseHandle(hThread);
      if WaitUntilIdle then WaitForInputIdle(hProcess, INFINITE);
      if WaitUntilTerminated then
        repeat
          Application.ProcessMessages;
        until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
      CloseHandle(hProcess);
    end;
end;

上記の関数の使用法

var
  FileName, Parameters, WorkingFolder: string;
  Error: integer;
  OK: boolean;
begin
  FileName := 'C:\FullPath\myapp.exe';
  WorkingFolder := ''; // if empty function will extract path from FileName
  Parameters := '-p'; // can be empty 
  OK := ExecuteProcess(FileName, Parameters, WorkingFolder, false, false, false, Error);
  if not OK then ShowMessage('Error: ' + IntToStr(Error));
end;

CreateProcessドキュメント



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow