获取DOS命令行输出函数

 

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 ;

转载于:https://www.cnblogs.com/lahcs/archive/2009/03/12/1409570.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值