In diesem Artikel wird die Ausführung eines Konsolenprogramms in Delphi implementiert und die Ausgabe des Konsolenprogramms im Memo-Steuerelement angezeigt.
Bei der Arbeit musste ich J2ME-Programme manuell kompilieren, aber die Verwendung fühlte sich sehr umständlich an, deshalb wollte ich Delphi verwenden, um ein integriertes Kompilierungstool zu erstellen. Die Java-Kompilierungstools sind jedoch allesamt Konsolenprogramme. Wie kann ich das Konsolenprogramm erfassen und in Memo anzeigen? Nachdem ich einige Informationen im Internet überprüft und wiederholt getestet habe, hoffe ich, dass es für alle hilfreich ist.
PROcedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
const
{Legen Sie die Größe von ReadBuffer fest}
ReadBuffer = 2400;
var
Sicherheit: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Puffer: PChar;
BytesRead: DWord;
Buff: Zeichenfolge;
beginnen
mit Sicherheit tun
beginnen
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
Ende;
{Erstellen Sie eine benannte Pipe, um die Ausgabe des Konsolenprogramms zu erfassen}
if Createpipe(ReadPipe, WritePipe, @Security, 0) dann
beginnen
Puffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0)
{Legen Sie die Startattribute des Konsolenprogramms fest}
mit start do
beginnen
cb := SizeOf(start);
start.lpReserved := nil;
lpDesktop := nil;
lpTitle := nil;
dwX := 0;
dwY := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
cbReserved2 := 0;
lpReserved2 := nil;
hStdOutput := WritePipe; // Leiten Sie die Ausgabe an die von uns erstellte WritePipe weiter
hStdInput := ReadPipe; //Direkte Eingabe in die von uns erstellte ReadPipe
hStdError := WritePipe;//Leiten Sie die Fehlerausgabe an die von uns erstellte WritePipe
dwFlags := STARTF_USESTDHANDLES oder STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//Setzen Sie das Fenster so ein, dass es ausgeblendet wird
Ende;
versuchen
{Erstellen Sie einen untergeordneten Prozess und führen Sie das Konsolenprogramm aus}
if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
NORMAL_PRIORITY_CLASS,
nil, nil, start, ProcessInfo) dann
beginnen
{Warten Sie, bis der Vorgang abgeschlossen ist}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{Schalten Sie die Ausgabe aus ... Ich habe sie zuerst nicht ausgeschaltet. Wenn keine Ausgabe erfolgt, stirbt das Programm. }
CloseHandle(WritePipe);
Buf := '';
{Lesen Sie die Ausgabe des Konsolenprogramms}
wiederholen
BytesRead := 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
Puffer[BytesRead] := #0;
OemToAnsi(Puffer, Puffer);
Buf := Buf + string(Puffer);
bis (BytesRead < ReadBuffer);
SendDebug(Buf);
{Nach Zeilenumbrüchen aufteilen und im Memo anzeigen}
while pos(#10, Buf) > 0 do
beginnen
AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));
Löschen(Buf, 1, pos(#10, Buf));
Ende;
Ende;
Endlich
FreeMem(Puffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
Ende;
Ende;
Ende;