function
GetDosOutput(Command:
string
):
string
;
var
hReadPipe : THandle;
hWritePipe : THandle;
SI : TStartUpInfo;
PI : TProcessInformation;
SA : TSecurityAttributes;
BytesRead : DWORD;
Dest : array [ 0 .. 32767 ] of char;
CmdLine : array [ 0 .. 512 ] of char;
Avail, ExitCode, wrResult : DWORD;
osVer : TOSVERSIONINFO;
tmpstr :AnsiString;
Line: String;
begin
osVer.dwOSVersionInfoSize : = Sizeof(TOSVERSIONINFO);
GetVersionEX(osVer);
if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin
SA.nLength : = SizeOf(SA);
SA.lpSecurityDescriptor : = nil ;
SA.bInheritHandle : = True;
CreatePipe(hReadPipe, hWritePipe, @SA, 0 );
end
else
CreatePipe(hReadPipe, hWritePipe, nil , 1024 );
try
FillChar(SI, SizeOf(SI), 0 );
SI.cb : = SizeOf(TStartUpInfo);
SI.wShowWindow : = SW_HIDE;
SI.dwFlags : = STARTF_USESHOWWINDOW;
SI.dwFlags : = SI.dwFlags or STARTF_USESTDHANDLES;
SI.hStdOutput : = hWritePipe;
SI.hStdError : = hWritePipe;
StrPCopy(CmdLine, Command);
if CreateProcess( nil , CmdLine, nil , nil , True, NORMAL_PRIORITY_CLASS, nil , nil , SI, PI) then
begin
ExitCode : = 0 ;
while ExitCode = 0 do
begin
wrResult : = WaitForSingleObject(PI.hProcess, 1000 );
if PeekNamedPipe(hReadPipe, @Dest[ 0 ], 32768 , @Avail, nil , nil ) then
begin
if Avail > 0 then
begin
try
FillChar(Dest, SizeOf(Dest), 0 );
ReadFile(hReadPipe, Dest[ 0 ], Avail, BytesRead, nil );
TmpStr : = Copy(Dest, 0 , BytesRead - 1 );
Line: = Line + TmpStr;
Except
end ;
end ;
end ;
if wrResult <> WAIT_TIMEOUT then ExitCode : = 1 ;
end ;
GetExitCodeProcess(PI.hProcess, ExitCode);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end ;
finally
if line = '' then line: = ' NULL ' ; // 命令没有输出回应!
result: = Line;
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end ;
end ;
var
hReadPipe : THandle;
hWritePipe : THandle;
SI : TStartUpInfo;
PI : TProcessInformation;
SA : TSecurityAttributes;
BytesRead : DWORD;
Dest : array [ 0 .. 32767 ] of char;
CmdLine : array [ 0 .. 512 ] of char;
Avail, ExitCode, wrResult : DWORD;
osVer : TOSVERSIONINFO;
tmpstr :AnsiString;
Line: String;
begin
osVer.dwOSVersionInfoSize : = Sizeof(TOSVERSIONINFO);
GetVersionEX(osVer);
if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin
SA.nLength : = SizeOf(SA);
SA.lpSecurityDescriptor : = nil ;
SA.bInheritHandle : = True;
CreatePipe(hReadPipe, hWritePipe, @SA, 0 );
end
else
CreatePipe(hReadPipe, hWritePipe, nil , 1024 );
try
FillChar(SI, SizeOf(SI), 0 );
SI.cb : = SizeOf(TStartUpInfo);
SI.wShowWindow : = SW_HIDE;
SI.dwFlags : = STARTF_USESHOWWINDOW;
SI.dwFlags : = SI.dwFlags or STARTF_USESTDHANDLES;
SI.hStdOutput : = hWritePipe;
SI.hStdError : = hWritePipe;
StrPCopy(CmdLine, Command);
if CreateProcess( nil , CmdLine, nil , nil , True, NORMAL_PRIORITY_CLASS, nil , nil , SI, PI) then
begin
ExitCode : = 0 ;
while ExitCode = 0 do
begin
wrResult : = WaitForSingleObject(PI.hProcess, 1000 );
if PeekNamedPipe(hReadPipe, @Dest[ 0 ], 32768 , @Avail, nil , nil ) then
begin
if Avail > 0 then
begin
try
FillChar(Dest, SizeOf(Dest), 0 );
ReadFile(hReadPipe, Dest[ 0 ], Avail, BytesRead, nil );
TmpStr : = Copy(Dest, 0 , BytesRead - 1 );
Line: = Line + TmpStr;
Except
end ;
end ;
end ;
if wrResult <> WAIT_TIMEOUT then ExitCode : = 1 ;
end ;
GetExitCodeProcess(PI.hProcess, ExitCode);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end ;
finally
if line = '' then line: = ' NULL ' ; // 命令没有输出回应!
result: = Line;
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end ;
end ;