บทความนี้ใช้การรันโปรแกรมคอนโซลใน Delphi และแสดงผลของโปรแกรมคอนโซลในตัวควบคุม Memo
ที่ทำงาน ฉันต้องคอมไพล์โปรแกรม J2ME ด้วยตนเอง ฉันเริ่มเขียนโปรแกรมแบบแบตช์ แต่รู้สึกว่าใช้งานยุ่งยากมาก ดังนั้นฉันจึงต้องการใช้ Delphi เพื่อสร้างเครื่องมือคอมไพล์แบบรวม อย่างไรก็ตาม เครื่องมือการคอมไพล์ Java นั้นเป็นโปรแกรมคอนโซลทั้งหมด จะจับโปรแกรมคอนโซลได้อย่างไร ส่งออกและแสดงใน Memo หลังจากตรวจสอบข้อมูลบางอย่างบนอินเทอร์เน็ตและทดสอบซ้ำแล้วซ้ำอีกฉันพบวิธีที่จะนำไปใช้:
กระบวนการ TMainForm.RunDosInMemo (const DosApp: string; AMemo: TMemo);
ค่าคงที่
{กำหนดขนาดของ ReadBuffer}
อ่านบัฟเฟอร์ = 2400;
var
ความปลอดภัย: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
เริ่มต้น: TStartUpInfo;
ข้อมูลกระบวนการ: TProcessInformation;
บัฟเฟอร์: PChar;
ไบต์อ่าน: DWord;
บัฟเฟอร์: สตริง;
เริ่ม
ด้วยการรักษาความปลอดภัยทำ
เริ่ม
ความยาว := SizeOf (TSecurityAttributes);
สืบทอดการจัดการ := จริง;
lpsecuritydescriptor := ไม่มี;
จบ;
{สร้างไปป์ที่มีชื่อเพื่อบันทึกผลลัพธ์ของโปรแกรมคอนโซล}
ถ้า Createpipe(ReadPipe, WritePipe, @Security, 0) แล้ว
เริ่ม
บัฟเฟอร์ := AllocMem(ReadBuffer + 1);
FillChar(เริ่ม, ขนาดของ(เริ่ม), #0)
{ตั้งค่าคุณลักษณะการเริ่มต้นของโปรแกรมคอนโซล}
ด้วยการเริ่มต้นทำ
เริ่ม
cb := SizeOf (เริ่มต้น);
start.lpReserved := ไม่มี;
lpDesktop := ไม่มี;
lpTitle := ไม่มี;
DWX := 0;
DWY := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReserved2 := 0;
lpReserved2 := ไม่มี;
hStdOutput := WritePipe; // กำหนดเอาต์พุตไปที่ WritePipe ที่เราสร้างขึ้น
hStdInput := ReadPipe; // ป้อนข้อมูลโดยตรงไปยัง ReadPipe ที่เราสร้างขึ้น
hStdError := WritePipe;//กำหนดเอาต์พุตข้อผิดพลาดไปที่ WritePipe ที่เราสร้างขึ้น
dwFlags := STARTF_USESTDHANDLES หรือ STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//ตั้งค่าหน้าต่างที่จะซ่อน
จบ;
พยายาม
{สร้างกระบวนการลูกและรันโปรแกรมคอนโซล}
ถ้า CreateProcess(ไม่มี, PChar(DosApp), @Security, @Security, จริง,
NORMAL_PRIORITY_CLASS
ไม่มี, ไม่มี, เริ่มต้น, ProcessInfo) จากนั้น
เริ่ม
{รอให้กระบวนการทำงานเสร็จสิ้น}
WaitForSingleObject (ProcessInfo.hProcess, INFINITE);
{ปิดเอาต์พุต...ฉันไม่ได้ปิดในตอนแรก ดังนั้น หากไม่มีเอาต์พุต โปรแกรมก็จะตาย -
CloseHandle (WritePipe);
บัฟ := '';
{อ่านผลลัพธ์ของโปรแกรมคอนโซล}
ทำซ้ำ
ไบต์อ่าน := 0;
ReadFile (ReadPipe, บัฟเฟอร์ [0], ReadBuffer, BytesRead, ไม่มี);
บัฟเฟอร์[ไบต์อ่าน] := #0;
OemToAnsi (บัฟเฟอร์, บัฟเฟอร์);
Buf := Buf + string(บัฟเฟอร์);
จนกระทั่ง (BytesRead < ReadBuffer);
SendDebug(Buf);
{แยกตามบรรทัดใหม่และแสดงในบันทึก}
ในขณะที่ pos(#10, Buf) > 0 ทำ
เริ่ม
AMemo.Lines.Add(คัดลอก(Buf, 1, pos(#10, Buf) - 1));
ลบ(Buf, 1, pos(#10, Buf));
จบ;
จบ;
ในที่สุด
FreeMem(บัฟเฟอร์);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
จบ;
จบ;
จบ;