Artikel ini mengimplementasikan menjalankan program konsol di Delphi dan menampilkan output dari program konsol di kontrol Memo.
Di tempat kerja, saya perlu mengkompilasi program J2ME secara manual. Saya mulai menulis program batch, tetapi rasanya sangat rumit untuk digunakan, jadi saya ingin menggunakan Delphi untuk membuat alat kompilasi terintegrasi. Namun, semua alat kompilasi Java adalah program konsol. Bagaimana cara menangkap program konsol? Keluarkan dan tampilkan di Memo. Setelah memeriksa beberapa informasi di Internet dan mengujinya berulang kali, saya menemukan cara untuk mengimplementasikannya. Saya harap ini dapat bermanfaat bagi semua orang:
Prosedur TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
konstanta
{Setel ukuran ReadBuffer}
BacaBuffer = 2400;
var
Keamanan: TSecurityAttributes;
ReadPipe, WritePipe: Pegangan;
mulai: TStartUpInfo;
Info Proses: Informasi Proses;
Penyangga: PChar;
ByteBaca: DWord;
Penggemar: tali;
mulai
dengan Keamanan lakukan
mulai
npanjang := SizeOf(TSecurityAttributes);
binherithandle := benar;
deskriptor keamanan lp := nihil;
akhir;
{Buat pipa bernama untuk menangkap output program konsol}
jika Createpipe(ReadPipe, WritePipe, @Security, 0) lalu
mulai
Penyangga := AllocMem(ReadBuffer + 1);
FillChar(Mulai, Ukuran(Mulai), #0)
{Setel atribut startup program konsol}
dengan mulai lakukan
mulai
cb := SizeOf(mulai);
start.lpReserved := nihil;
lpDesktop := nihil;
lpJudul := nihil;
dwX := 0;
dwY := 0;
dwXUkuran := 0;
dwYUkuran := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReservasi2 := 0;
lpReserved2 := nihil;
hStdOutput := WritePipe; //Arahkan output ke WritePipe yang kita buat
hStdInput := ReadPipe; //Input langsung ke ReadPipe yang kita buat
hStdError := WritePipe;//Arahkan output error ke WritePipe yang kita buat
dwFlags := STARTF_USESTDHANDLES atau STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//Setel jendela untuk disembunyikan
akhir;
mencoba
{Buat proses anak dan jalankan program konsol}
jika CreateProcess(nil, PChar(DosApp), @Keamanan, @Keamanan, benar,
NORMAL_PRIORITY_CLASS,
nihil, nihil, mulai, ProcessInfo) lalu
mulai
{Tunggu hingga proses selesai berjalan}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{Matikan outputnya...Saya tidak mematikannya pada awalnya. Alhasil, jika tidak ada output, program akan mati. }
CloseHandle(WritePipe);
Tapi := '';
{Baca keluaran program konsol}
mengulang
ByteBaca := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nihil);
Buffer[ByteBaca] := #0;
OemToAnsi(Penyangga, Penyangga);
Buf := Buf + string(Buffer);
sampai (BytesRead < ReadBuffer);
KirimDebug(Buf);
{Pisahkan menurut baris baru dan ditampilkan di Memo}
sementara pos(#10, Buf) > 0 lakukan
mulai
AMemo.Lines.Add(Salin(Buf, 1, pos(#10, Buf) - 1));
Hapus(Buf, 1, pos(#10, Buf));
akhir;
akhir;
Akhirnya
FreeMem(Penyangga);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(BacaPipe);
akhir;
akhir;
akhir;