この記事では、Delphi でコンソール プログラムの実行を実装し、コンソール プログラムの出力をメモ コントロールに表示します。
仕事で J2ME プログラムを手動でコンパイルする必要があり、バッチ プログラムを書き始めましたが、非常に使いにくいと感じたので、Delphi を使用して統合コンパイル ツールを作成したいと思いました。しかし、Java コンパイル ツールはすべてコンソール プログラムです。コンソールプログラムをキャプチャしてメモに表示するにはどうすればよいですか?インターネットでいくつかの情報を確認し、テストを繰り返した結果、それを実装する方法が見つかりました。
PROcedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
定数
{ReadBufferのサイズを設定する}
読み取りバッファ = 2400;
変数
セキュリティ: TSecurityAttributes;
ReadPipe、WritePipe: THandle;
開始: TStartUpInfo;
プロセス情報: Tプロセス情報;
バッファ: PChar;
バイト読み取り: DWord;
バッファ: 文字列;
始める
セキュリティ付き
始める
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
終わり;
{コンソール プログラムの出力をキャプチャする名前付きパイプを作成する}
if Createpipe(ReadPipe, WritePipe, @Security, 0) then
始める
バッファ := AllocMem(ReadBuffer + 1);
FillChar(開始, Sizeof(開始), #0)
{コンソールプログラムの起動属性を設定する}
開始してください
始める
cb := SizeOf(開始);
start.lpReserved := nil;
lpデスクトップ := nil;
lpTitle := nil;
dwX := 0;
dwY := 0;
dwXサイズ := 0;
dwYサイズ := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReserved2 := 0;
lpReserved2 := nil;
hStdOutput := WritePipe // 作成した WritePipe に出力を送ります。
hStdInput := ReadPipe // 作成した ReadPipe への直接入力;
hStdError := WritePipe;// 作成した WritePipe にエラー出力を送信します
dwFlags := STARTF_USESTDHANDLES または STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;// ウィンドウを非表示に設定します
終わり;
試す
{子プロセスを作成し、コンソール プログラムを実行します}
if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
NORMAL_PRIORITY_CLASS、
nil、nil、start、ProcessInfo) その後
始める
{プロセスの実行が完了するまで待ちます}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{出力をオフにします...最初はオフにしませんでした。その結果、出力がなければプログラムは終了します。 }
CloseHandle(WritePipe);
ブフ := '';
{コンソール プログラムの出力を読む}
繰り返す
バイト読み取り := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
バッファ[バイト読み取り] := #0;
OemToAnsi(バッファ, バッファ);
Buf := Buf + 文字列(バッファ);
(BytesRead < ReadBuffer);
SendDebug(Buf);
{改行に従って分割してメモに表示}
while pos(#10, Buf) > 0 do
始める
AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));
削除(Buf, 1, pos(#10, Buf));
終わり;
終わり;
ついに
FreeMem(バッファ);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
終わり;
終わり;
終わり;