Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】EXE間で終了ステータスを受け渡し

今回はDelphi/400で終了コード(終了ステータス)を受け取る方法を紹介します。

実行時引数を使って「呼び出し側」のEXE等から別のプログラムを呼び出す処理において、
逆に「呼び出される側」からのパラメータを「呼び出し側」で受け取る方法です。

「呼び出される側」はExitCode変数に対して値を代入後にプログラムを終了し、
「呼び出し側」は GetExitCodeProcess APIを使用して、
プロセスハンドルから、終了コードを受け取る事が可能です。

本記事では、その手順を解説します。
(※ExitCodeは整数型となります。初期値は0です。)

 


<呼び出される側の処理>

  ExitCode := 1;  // 返却値

 


<呼び出し側の処理>

※他のEXEを呼び出す方法はShellExecuteなどいくつか存在しますが、
 ここではプロセスハンドルを取得できるCreateProcessを使用します。

var
  bRet: Boolean;
  SI: TStartupInfo;
  PI: TProcessInformation;
  caExitCode: Cardinal; // ここに値が返却される
  sExeName: string;
begin
  // EXEを呼び出す
  GetStartupInfo(SI);
  sExeName:='XXXXXX.exe';
  bRet := CreateProcess(
              PChar(sExeName),
              nil,nil,nil,False,
              CREATE_DEFAULT_ERROR_MODE,
              nil,nil,SI,PI);
  // エラーチェック
  if not bRet then
  begin
    // 起動に失敗したら例外を作成
    raise Exception.Create('Exec Error' + IntToStr(GetLastError));
  end
  else
  begin
    // 呼び出したEXEの終了待ち
    WaitForSingleObject(PI.hProcess,INFINITE);
    // 返却値の取得
    GetExitCodeProcess(PI.hProcess,caExitCode);
    // ハンドルのクローズ
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
    // 返却値の表示
    ShowMessage(IntToStr(caExitCode));
  end;
end;

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.129 2011年8月号より)
(Tipsメルマガ 2020年11月号より)