程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 執行控制台程序並且獲得它的輸出結果

執行控制台程序並且獲得它的輸出結果

編輯:Delphi

前幾日遇到的問題在各位的幫助下已經圓滿解決,現在吧這段代碼寫出來,可能會有一點用處。
procedure CheckResult(b: Boolean);
begin
  if not b then
    Raise Exception.Create(SysErrorMessage(GetLastError));
end;

function RunDOS(const Prog, CommandLine,Dir: String;var ExitCode:DWORD): 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+STARTF_USESHOWWINDOW;
  StartInfo.hStdError  := HWrite;
  StartInfo.hStdInput  := GetStdHandle(STD_INPUT_HANDLE);//HRead;
  StartInfo.hStdOutput  := HWrite;

  b := CreateProcess(PChar(Prog),//lpApplicationName: PChar     
        PChar(CommandLine),    //lpCommandLine: PChar
        nil,    //lpProcessAttributes: PSecurityAttributes
        nil,    //lpThreadAttributes: PSecurityAttributes
        True,    //bInheritHandles: BOOL
        CREATE_NEW_CONSOLE,
        nil,       
        PChar(Dir),
        StartInfo,
        ProceInfo    );

  CheckResult(b);
  WaitForSingleObject(ProceInfo.hProcess,INFINITE);
  GetExitCodeProcess(ProceInfo.hProcess,ExitCode);

  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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved