您的位置:首页 > 编程语言 > Delphi

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

2016-12-21 10:53 489 查看
[delphi] view
plain copy

 print?





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;  

调用方式:

[delphi] view
plain copy

 print?





GetRunConsoleResult(执行文件,SW_SHOWNORMAL,返回字符串); //函数执行成功返回 0  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi 控制台