A ver si les gusta:
Código Delphi
[-]
const
BUFFER_SIZE = 2400;
function GetConsoleText(ACommandLine: string): string;
var
lSecAttr: TSecurityAttributes;
hReadPipe,
hWritePipe: THandle;
Buffer: PChar;
lStartupInfo: TStartUpInfo;
lProcessInfo: TProcessInformation;
dwBytesRead,
dwExitCode: DWORD;
begin
Result := '';
with lSecAttr do
begin
nlength := SizeOf(TSecurityAttributes) ;
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
if CreatePipe(hReadPipe, hWritePipe, @lSecAttr, 0) then
try
Buffer := AllocMem(BUFFER_SIZE + 1);
try
FillChar(lStartupInfo, Sizeof(lStartupInfo), #0);
with lStartupInfo do
begin
cb := SizeOf(lStartupInfo);
hStdOutput := hWritePipe;
hStdInput := hReadPipe;
dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;
end;
if CreateProcess(nil, PChar(ACommandLine), @lSecAttr, @lSecAttr, TRUE,
NORMAL_PRIORITY_CLASS, nil, nil, lStartupInfo, lProcessInfo) then
try
repeat
dwExitCode := WaitForSingleObject(lProcessInfo.hProcess, 1000);
Application.ProcessMessages;
until dwExitCode <> WAIT_TIMEOUT;
repeat
dwBytesRead := 0;
ReadFile(hReadPipe, Buffer[0], BUFFER_SIZE, dwBytesRead, nil);
Buffer[dwBytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Result := Result + string(Buffer);
until (dwBytesRead < BUFFER_SIZE);
finally
CloseHandle(lProcessInfo.hProcess);
CloseHandle(lProcessInfo.hThread);
end;
finally
FreeMem(Buffer);
end;
finally
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Text := GetConsoleText('CMD /C DIR C:\*.*');
end;
Este ejemplo lee lo que se ha generado en un proceso de consola, este código lo utilizo hace un tiempo, en un "Extended Procedure" de SqlServer 2000 para leer unas claves generadas por programas de consola...
Saludos!