Delphi 执行控制台(console)程序获取返回结果

来源:互联网 发布:python的语法结构 编辑:程序博客网 时间:2024/06/07 18:40
function GetRunConsoleResult(FileName:String;Visibility:Integer;var mOutputs:string):Integer;var  sa:TSecurityAttributes;  hReadPipe,hWritePipe:THandle;  ret:BOOL;  strBuff:array[0..255] of char;  lngBytesread:DWORD;    WorkDir:String;  StartupInfo:TStartupInfo;  ProcessInfo:TProcessInformation;begin  FillChar(sa,Sizeof(sa),#0);  sa.nLength := Sizeof(sa);  sa.bInheritHandle := True;  sa.lpSecurityDescriptor := nil;  if not(CreatePipe(hReadPipe, hWritePipe, @sa, 0)) then    begin      Result:=-2;  //通道创建失败    end;  WorkDir:=ExtractFileDir(Application.ExeName);  FillChar(StartupInfo,Sizeof(StartupInfo),#0);  StartupInfo.cb:=Sizeof(StartupInfo);  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;  StartupInfo.wShowWindow:=Visibility;  StartupInfo.hStdOutput:=hWritePipe;  StartupInfo.hStdError:=hWritePipe;  if not CreateProcess(nil,    PChar(FileName),               { pointer to command line string }    @sa,                           { pointer to process security attributes }    @sa,                           { pointer to thread security attributes }    True,                          { handle inheritance flag }    NORMAL_PRIORITY_CLASS,    nil,                           { pointer to new environment block }    PChar(WorkDir),                { pointer to current directory name, PChar}    StartupInfo,                   { pointer to STARTUPINFO }    ProcessInfo)                   { pointer to PROCESS_INF }  then    Result := INFINITE {-1 进程创建失败}  else    begin      CloseHandle(hWritePipe);      mOutputs:='';      while ret do      begin        FillChar(strBuff,Sizeof(strBuff),#0);        ret := ReadFile(hReadPipe, strBuff, 256, lngBytesread, nil);        mOutputs := mOutputs + strBuff;      end;      Application.ProcessMessages;      //等待console结束      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);      GetExitCodeProcess(ProcessInfo.hProcess,  Cardinal(Result));      CloseHandle(ProcessInfo.hProcess);  { to prevent memory leaks }      CloseHandle(ProcessInfo.hThread);      CloseHandle(hReadPipe);    end;end;


调用方式:

GetRunConsoleResult(执行文件,SW_SHOWNORMAL,返回字符串); //函数执行成功返回 0



0 0
原创粉丝点击