Delphi Programming / Object Pascal
[掲載 2005年02月15日] [更新 2013年10月21日] Delphi サンプルプログラム集 |
540_バッチファイルを CreateProcess 関数で実行 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro |
|
540_ConsoleBat2.zip [1,088 KB] 2013年10月21日版 (EXE 同梱) |
バッチファイルを CreateProcess 関数で実行 |
拡張子が .BAT のファイルを,CreateProcess 関数を使用して実行するサンプルです.
CreateProcess 関数の他のサンプルと違うのは,実行ファイルがバッチファイルであることです.
本ページのサンプルは,コマンドプロセッサ (コマンドプロンプトを起動するプログラム) を非表示で起動して,バッチファイルに書かれたコマンドを実行します.
バッチファイルは実行時に作成しています.バッチファイルに書かれたコマンドの実行が終了したら,そのバッチファイル自身を自動的に削除します.
バッチファイルの内容は,
- 指定したアプリケーションを起動
- そのアプリケーションが終了するまで待ち,別のコマンドを実行
となっています. |
[備考]
コマンドプロンプトに関しては以下の記事も参考にしてください.
|
|
図1
摂家時画面
|
|
図2
[バッチ処理] ボタンをクリック
- ImageMetaFile.exe が起動する
- コマンドプロンプトは非表示
- 手前のフォームがバッチファイルで起動したプログラムのフォーム
- このプログラムを終了するまで Form1 に戻らない
|
|
図3
終了 |
|
図4
バッチファイルの出力結果
|
|
図5
TestDir.txt の例 |
リスト1
CreateProcess 関数でバッチファイルを実行
バッチファイルをコード内で作成して,実行後,そのバッチファイルを削除 |
unit ConsoleBat2Unit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, 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
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
Result := 0;
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
SetLength(FileName, Length(FileName));
//参照カウンタ対策
UniqueString(FileName);
if not CreateProcess(nil,
PChar(FileName),
nil,
nil,
False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then begin
Result := WAIT_FAILED;
end else begin
//起動したプロセスが終了するまで待つ
while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
//=============================================================================
// バッチファイルの実行例
// (1)サンプルImageMetaFile.exeを実行し,終了まで待つ
// (2)指定ディレクトリリストをこのフォルダにTestDir.txtで保存
//
// BatFullPath バッチファイルの保存先
// OutFullPath 出力先のファイルの保存先
// TestExePath テスト用実行ファイル
// 終了後にDEL %0で作成したバッチファイル自身を削除する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
TestExePath : String;
BatFullPath : String;
OutFullPath : String;
SL : TStringList;
begin
Self.Enabled := False;
SL := TStringList.Create;
try
TestExePath := 'ImageMetaFile.exe';
BatFullPath := ExtractFilePath(Application.ExeName) + 'Testbat.BAT';
OutFullPath := ExtractFilePath(Application.ExeName) + 'TestDir.TXT';
DeleteFile(OutFullPath);
//バッチファイルを作成してこのアプリのフォルダに保存
SL.Add(TestExePath);
SL.Add('CD D:\');
SL.Add('DIR>' + OutFullPath);
SL.Add('DEL %0');
SL.Add('EXIT');
SL.SaveToFile(BatFullPath);
finally
FreeAndNil(SL);
end;
//バッチの実行
WinExecAndWait32V2(BatFullPath, SW_HIDE);
Self.Enabled := True;
SetForegroundWindow(Handle);
//CreateProcessの場合はここでも削除可能
//DeleteFile(BatFullPath);
Application.MessageBox('終了しました', 'バッチ処理', MB_OK);
end;
end.
|