注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

海宏软件的个人主页

用机器解放人的双手

 
 
 

日志

 
 

Delphi执行程序,并等待其返回值System.exitCode  

2008-06-25 11:11:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//执行程序,并等待其返回值System.exitCode
function WinExecAndWait32(sExe:String):DWord;                   overLoad;
function WinExecAndWait32(sExe:String;
        Visibility:Integer;var mOutputs:string):Cardinal;       overLoad;


//========================函数代码与类具体执行段=======================//
Implementation


//执行程序,并等待其返回值System.exitCode
//http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=36163
function WinExecAndWait32(sExe:String):DWord;
var rt, n: DWORD;
    si  : STARTUPINFO;
    pi  : PROCESS_INFORMATION;
    p   : pAnsiChar;
begin
    result:=0;
    //
    zeroMemory(@si, sizeOf(si));
    si.cb:=sizeOf(si);
    zeroMemory(@pi, sizeOf(pi));
    if not CreateProcess(nil, pChar(sExe), nil, nil, FALSE, CREATE_NO_WINDOW, nil, nil, si, pi) then begin
        raise exception.create('CreateProcess failed!');
        exit;
    end;
    repeat
        rt:=WaitForSingleObject(pi.hProcess, 0);
        Application.ProcessMessages();
        Sleep(100);
    until rt<>wait_TimeOut;
    if (GetExitCodeProcess(pi.hProcess, rt)) then result:=rt;
    //
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
end;
//执行程序并等待其返回值,包括一系列输出
//http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=27232
function WinExecAndWait32(sExe:String;Visibility:Integer;var mOutputs:string):Cardinal;
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;     //lpSecurityDeforbiddenor
  ret := CreatePipe(hReadPipe, hWritePipe, @sa, 0);
  
  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(sExe),          { pointer to command line string }
        @sa,                  { pointer to process security attributes }
        @sa,                  { pointer to thread security attributes }
        True,                 { handle inheritance flag }
        // CREATE_NEW_CONSOLE or { creation flags }
        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
      // Form1.Hide;
      // FileOpen(FileName,fmShareExclusive);
      // SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
      ret:=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;
      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, Result);
      CloseHandle(ProcessInfo.hProcess); { to prevent memory leaks }
      CloseHandle(ProcessInfo.hThread);
      // Form1.Close; { exit application }
      ret := CloseHandle(hReadPipe);
  end;
end;

  评论这张
 
阅读(1031)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017