Este artículo implementa la ejecución de un programa de consola en Delphi y muestra el resultado del programa de consola en el control Memo.
En el trabajo, necesitaba compilar manualmente programas J2ME. Comencé a escribir un programa por lotes, pero me parecía muy complicado de usar, así que quería usar Delphi para crear una herramienta de compilación integrada. Sin embargo, las herramientas de compilación de Java son todas programas de consola. ¿Cómo capturar el programa de la consola y mostrarlo en Memo? Después de verificar cierta información en Internet y probarla repetidamente, encontré una manera de implementarla, espero que sea útil para todos.
Procedimiento TMainForm.RunDosInMemo(const DosApp: cadena; AMemo: TMemo);
constante
{Establecer el tamaño de ReadBuffer}
Buffer de lectura = 2400;
var
Seguridad: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
inicio: TStartUpInfo;
Información del proceso: TProcessInformation;
Tampón: PChar;
BytesLeer: DWord;
Buf: cuerda;
comenzar
con seguridad hacer
comenzar
nlength := TamañoDe(TSecurityAttributes);
binherithandle: = verdadero;
lpsecuritydescriptor := nulo;
fin;
{Cree una canalización con nombre para capturar la salida del programa de la consola}
si Createpipe (ReadPipe, WritePipe, @Security, 0) entonces
comenzar
Búfer := AllocMem(ReadBuffer + 1);
FillChar(Inicio, Tamaño de(Inicio), #0)
{Establecer los atributos de inicio del programa de consola}
con inicio hacer
comenzar
cb := TamañoDe(inicio);
start.lpReserved := nil;
lpDesktop := nil;
lpTítulo := nulo;
dwX := 0;
dwY := 0;
tamaño dwX := 0;
tamaño dwY := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute: = 0;
cbReservado2 := 0;
lpReserved2:= nil;
hStdOutput := WritePipe; // Dirige la salida al WritePipe que creamos.
hStdInput := ReadPipe; // Entrada directa al ReadPipe que creamos.
hStdError := WritePipe;// Dirige la salida del error al WritePipe que creamos
dwFlags := STARTF_USESTDHANDLES o STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//Configurar la ventana para ocultar
fin;
intentar
{Crear un proceso hijo y ejecutar el programa de consola}
si CreateProcess(nil, PChar(DosApp), @Security, @Security, verdadero,
NORMAL_PRIORITY_CLASS,
nulo, nulo, inicio, ProcessInfo) entonces
comenzar
{Esperar a que termine el proceso}
WaitForSingleObject(ProcessInfo.hProcess, INFINITO);
{Apague la salida... No la apagué al principio. Como resultado, si no hay salida, el programa morirá. }
CerrarMango(WritePipe);
Buf := '';
{Leer el resultado del programa de consola}
repetir
Bytes leídos: = 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
Búfer[BytesRead] := #0;
OemToAnsi (búfer, búfer);
Buf := Buf + cadena(Buffer);
hasta (BytesRead <ReadBuffer);
EnviarDepuración(Buf);
{Dividido según nuevas líneas y mostrado en Memo}
mientras pos(#10, Buf) > 0 hacer
comenzar
AMemo.Lines.Add(Copiar(Buf, 1, pos(#10, Buf) - 1));
Eliminar(Buf, 1, pos(#10, Buf));
fin;
fin;
finalmente
FreeMem(búfer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CerrarMango(ReadPipe);
fin;
fin;
fin;