您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi调用Cmd命令行并取得返回结果

时间:2011/9/3 15:37:00 点击:

  核心提示:procedure CheckResult(b: Boolean); beginif not b thenRaise Exception.Create(SysErrorMessage(GetLastE...
procedure CheckResult(b: Boolean);
begin
  if not b then
  Raise Exception.Create(SysErrorMessage(GetLastError));
end;

function RunDOS(const 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,//lpApplicationName: PChar
  PChar(CommandLine), //lpCommandLine: PChar
  nil, //lpProcessAttributes: PSecurityAttributes
  nil, //lpThreadAttributes: PSecurityAttributes
  True, //bInheritHandles: BOOL
  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);
    Result := sRet.Text;
    sRet.Free;
  end;
  inS.Free;

  CloseHandle(HRead);
  CloseHandle(HWrite);
end;  

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号