unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

   //-----------------------------------------------------------------------------
//  CreateProcess関数を使用して，指定したファイルを実行する
//  起動したアプリが終了するまでこの関数が終了しないコードになっている
//-----------------------------------------------------------------------------
function WinExecAndWait32V2(FileName: String; Visibility: Integer): DWORD;
var
  LStartupInfo : TStartupInfo;
  LProcessInfo : TProcessInformation;
begin
  Result := 0;

  FillChar(LStartupInfo, SizeOf(LStartupInfo), #0);
  LStartupInfo.cb          := SizeOf(TStartupInfo);
  //以下の4行とdwFlagsにSTARTF_USERPOSITION,STARTF_USESIZEを追加
  //位置とサイズを指定する必要がなければこれらの設定は不要
  LStartupInfo.dwX         := 0;
  LStartupInfo.dwY         := 0;
  LStartupInfo.dwXSize     := 500;
  LStartupInfo.dwYSize     := 600;
  LStartupInfo.lpTitle     := PChar('コマンドプロンプト');
  LStartupInfo.dwFlags     := STARTF_USESHOWWINDOW or
                              STARTF_USEPOSITION or
                              STARTF_USESIZE;
  LStartupInfo.wShowWindow := Visibility;

  SetLength(FileName, Length(FileName));

  //参照カウンタ対策
  UniqueString(FileName);
  if not CreateProcess(nil,
                       PChar(FileName),
                       nil,
                       nil,
                       False,
                       NORMAL_PRIORITY_CLASS,
                       nil,
                       nil,
                       LStartupInfo,
                       LProcessInfo) then begin
    Result := WAIT_FAILED;
  end else begin
    //起動したプロセスが終了するまで待つ
    while WaitForSingleObject(LProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
      Application.ProcessMessages;

    GetExitCodeProcess(LProcessInfo.hProcess, Result);
    CloseHandle(LProcessInfo.hProcess);
    CloseHandle(LProcessInfo.hThread);
  end;
end;

//=============================================================================
//  コマンドプロンプトを表示
//  コマンドプロンプトを終了しないと，このアプリは終了できない
//  そこで，このフォームにフォーカス移動できないようにしている
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Enabled := False;
  WinExecAndWait32V2('Cmd.exe /k cd /d c:\', SW_SHOWNORMAL);
  Self.Enabled := True;
end;

end.


