下面的代码适用于 Delphi XE,但 2400 的缓冲区大小相当难看。
有人对清理这个例程有一些建议吗?并使 2400 限制消失(不定义 64000 缓冲区)。
Thanks
procedure TForm1.Button1Click(Sender: TObject);
begin
CaptureConsoleOutput('c:\windows\system32\ipconfig','',Memo1);
end;
过程 TForm1.CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
常量
CReadBuffer = 2400;
变量
saSecurity:TSecurityAttributes;
hRead:THandle;
hWrite:THandle;
suiStartup:TStartupInfo;
piProcess: TProcessInformation;
pBuffer:AnsiChar 的数组[0..CReadBuffer];
dRead:双字;
d运行:双字;
开始
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := True;
saSecurity.lpSecurityDescriptor := nil;
如果 CreatePipe(hRead, hWrite, @saSecurity, 0) 那么
开始
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.hStdInput := hRead;
suiStartup.hStdOutput := hWrite;
suiStartup.hStdError := hWrite;
suiStartup.dwFlags := STARTF_USESTDHANDLES 或 STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
@saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
then
begin
repeat
dRunning := WaitForSingleObject(piProcess.hProcess, 100);
Application.ProcessMessages();
repeat
dRead := 0;
ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
pBuffer[dRead] := #0;
OemToAnsi(pBuffer, pBuffer);
AMemo.Lines.Add(String(pBuffer));
until (dRead < CReadBuffer);
until (dRunning <> WAIT_TIMEOUT);
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
end;
CloseHandle(hRead);
CloseHandle(hWrite);
结尾;
结尾;