是这个吧?[
]
此函数能够实现功能,但是如果控制台没有相应,则程序死掉。使用时需要进行修改,同时此函数经过改动能够实现向Dos控制台发送消息的功能。
function GetDosOutput(const CommandLine: string): string;
var
; SA: TSecurityAttributes;
; SI: TStartupInfo;
; PI: TProcessInformation;
; StdOutPipeRead, StdOutPipeWrite: THandle;
; WasOK: Boolean;
; Buffer: array[0..255] of Char;
; BytesRead: Cardinal;
; WorkDir, Line: string;
begin
; Application.ProcessMessages;
; with SA do
; begin
; ; nLength := SizeOf(SA);
; ; bInheritHandle := True;
; ; lpSecurityDescriptor := nil;
; end;
; // create pipe for standard output redirection
; CreatePipe(StdOutPipeRead, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// read handle
; ; StdOutPipeWrite, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// write handle
; ; @SA, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// security attributes
; ; 0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; // number of bytes reserved for pipe - 0 default
; ; );
; try
// Make child process use StdOutPipeWrite as standard out,
// and make sure it does not show on screen.
; ; with SI do
; ; begin
; ; ; FillChar(SI, SizeOf(SI), 0);
; ; ; cb := SizeOf(SI);
; ; ; dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
; ; ; wShowWindow := SW_HIDE;
; ; ; hStdInput := GetStdHandle(STD_INPUT_HANDLE); ; ; ; ; ;// don't redirect std input
; ; ; hStdOutput := StdOutPipeWrite;
; ; ; hStdError := StdOutPipeWrite;
; ; end;
; ; // launch the command line compiler
; ; WorkDir := ExtractFilePath(CommandLine);
; ; WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil,
; ; ; PChar(WorkDir), SI, PI);
; ; // Now that the handle has been inherited, close write to be safe.
; ; // We don't want to read or write to it accidentally.
; ; CloseHandle(StdOutPipeWrite);
; ; // if process could be created then handle its output
; ; if not WasOK then
; ; ; raise Exception.Create('Could not execute command line!')
; ; else
; ; try
; ; ; // get all output until dos app finishes
; ; ; Line := '';
; ; ; repeat
; ; ; ;// read block of characters (might contain carriage returns and line feeds)
; ; ; ; WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
; ; ; ; // has anything been read?
; ; ; ; if BytesRead > 0 then
; ; ; ; begin
; ; ; ; ; // finish buffer to PChar
; ; ; ; ; Buffer[BytesRead] := #0;
; ; ; ; ; // combine the buffer with the rest of the last run
; ; ; ; ; Line := Line + Buffer;
; ; ; ; end;
; ; ; until not WasOK or (BytesRead = 0);
; ; ; // wait for console app to finish (should be already at this point)
; ; ; WaitForSingleObject(PI.hProcess, INFINITE);
; ; finally
; ; ; // Close all remaining handles
; ; ; CloseHandle(PI.hThread);
; ; ; CloseHandle(PI.hProcess);
; ; end;
; finally
; ; result := Line;
; ; CloseHandle(StdOutPipeRead);
; end;
end;