delphi调用dos命令

本文介绍如何使用Delphi编写一个TRunDos类来运行DOS命令并检查结果,包括创建管道、设置启动信息、创建进程以及读取输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unit RunDos;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
Type
   TRunDos=class(TObject)
   public
   procedure CheckResult(b:Boolean);
   function RunDOS(CommandLine:   String):   String;
end;
implementation

{ TRunDos }

procedure TRunDos.CheckResult(b: Boolean);
begin
   if   not   b   then
    Raise   Exception.Create(SysErrorMessage(GetLastError));
end;

function TRunDos.RunDOS(CommandLine: String): String;
var
      HRead,HWrite:THandle;
      StartInfo:TStartupInfo;  
      ProceInfo:TProcessInformation;  
      b:Boolean;  
      sa:TSecurityAttributes;  
      inS:THandleStream;  
      sRet:TStrings;  
  begin  
      Result   :=   '';  
      FillChar(sa,sizeof(sa),0);  
      //设置允许继承,否则在NT和2000下无法取得输出结果  
      sa.nLength   :=   sizeof(sa);  
      sa.bInheritHandle   :=   True;  
      sa.lpSecurityDescriptor   :=   nil;  
      b   :=   CreatePipe(HRead,HWrite,@sa,0);  
      CheckResult(b);   
      FillChar(StartInfo,SizeOf(StartInfo),0);  
      StartInfo.cb   :=   SizeOf(StartInfo);  
      StartInfo.wShowWindow   :=   SW_HIDE;  
      //使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式  
      StartInfo.dwFlags         :=   STARTF_USESTDHANDLES   or   STARTF_USESHOWWINDOW;  
      StartInfo.hStdError     :=   HWrite;  
      StartInfo.hStdInput     :=   GetStdHandle(STD_INPUT_HANDLE);//HRead;  
      StartInfo.hStdOutput     :=   HWrite;   
      b   :=   CreateProcess(nil,
                  PChar(CommandLine),
                  nil,
                  nil,
                  True,        
                  CREATE_NEW_CONSOLE,  
                  nil,                  
                  nil,  
                  StartInfo,  
                  ProceInfo         );  
   
      CheckResult(b);  
      WaitForSingleObject(ProceInfo.hProcess,INFINITE);  
      inS   :=   THandleStream.Create(HRead);  
      if   inS.Size>0   then  
      begin  
          sRet   :=   TStringList.Create;  
          sRet.LoadFromStream(inS);
          showmessage(sRet.Text); 
          Result   :=   sRet.Text;  
          sRet.Free;  
      end;  
      inS.Free;
   
      CloseHandle(HRead);  
      CloseHandle(HWrite); 

end;

end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值