Este artigo implementa a execução de um programa de console no Delphi e exibe a saída do programa de console no controle Memo.
No trabalho, eu precisava compilar manualmente os programas J2ME. Comecei a escrever um programa em lote, mas parecia muito complicado de usar, então queria usar o Delphi para fazer uma ferramenta de compilação integrada. Como capturar a saída do programa do console e exibi-la no Memo Depois de verificar algumas informações na Internet e testar repetidamente, encontrei uma maneira de implementá-la.
PRocedure TMainForm.RunDosInMemo(const DosApp: string; AMemo: TMemo);
const
{Definir o tamanho do ReadBuffer}
LerBuffer = 2400;
var
Segurança: TSecurityAttributes;
ReadPipe, WritePipe: Thandle;
iniciar: TStartUpInfo;
ProcessInfo: TProcessInformation;
Tampão: PChar;
BytesLeitura: DWord;
Buff: string;
começar
com Segurança faça
começar
nlength := SizeOf(TSecurityAttributes);
binherithandle := verdadeiro;
lpsecuritydescriptor := nil;
fim;
{Crie um pipe nomeado para capturar a saída do programa de console}
se Createpipe(ReadPipe, WritePipe, @Security, 0) então
começar
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Iniciar, Sizeof(Iniciar), #0)
{Defina os atributos de inicialização do programa de console}
com começar faça
começar
cb := SizeOf(início);
start.lpReserved := nil;
lpDesktop := nulo;
lpTitle := nulo;
dwX := 0;
dwY := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute:= 0;
cbReservado2 := 0;
lpReserved2 := nulo;
hStdOutput := WritePipe; //Direciona a saída para o WritePipe que criamos
hStdInput := ReadPipe; //Entrada direta para o ReadPipe que criamos
hStdError := WritePipe;//Direciona a saída do erro para o WritePipe que criamos
dwFlags := STARTF_USESTDHANDLES ou STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;//Configura a janela para ocultar
fim;
tentar
{Crie um processo filho e execute o programa de console}
if CreateProcess(nil, PChar(DosApp), @Security, @Security, true,
NORMAL_PRIORITY_CLASS,
zero, zero, iniciar, ProcessInfo) então
começar
{Aguarde a conclusão do processo}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
{Desligue a saída... Não desliguei primeiro. Como resultado, se não houver saída, o programa morrerá. }
CloseHandle(WritePipe);
Buf := '';
{Leia a saída do programa de console}
repita
BytesLeitura:= 0;
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Buf := Buf + string(Buffer);
até (BytesRead <ReadBuffer);
SendDebug(Buf);
{Dividido de acordo com novas linhas e exibido no Memo}
enquanto pos(#10, Buf) > 0 faça
começar
AMemo.Lines.Add(Copy(Buf, 1, pos(#10, Buf) - 1));
Excluir(Buf, 1, pos(#10, Buf));
fim;
fim;
finalmente
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
fim;
fim;
fim;