执行一程序并等待其结束,下面这个函数执行会出错,如果有其它方法能实现这个功能也欢迎提出来!!!function WinExecAndWait32(FileName:String; Visibility :integer):integer;varzAppName:array[0..512] of char;zCurDir:array[0..255] of char;WorkDir:String;StartupInfo:TStartupInfo;ProcessInfo:TProcessInformation;beginStrPCopy(zAppName ,FileName);
GetDir(0 ,WorkDir);StrPCopy(zCurDir,WorkDir);FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,zAppName,nil,nil,false, CREATE_NEW_CONSOLE or  NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then Result := -1
else beginWaitforSingleObject(ProcessInfo.hProcess,INFINITE);GetExitCodeProcess(ProcessInfo.hProcess,Result);end;end;

解决方案 »

  1.   

    function Execute(cmd)
    STARTUPINFO start;
    PROCESS_INFORMATION proc;
    NUMBER ret, i;
    begin
      start.cb = 68;
      start.wShowWindow =0;
      start.dwFlags = STARTF_USESHOWWINDOW;
      if CreateProcessA(0, cmd, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, &start, &proc) != 0 then
        ret = WaitForSingleObject(proc.hProcess,  0xFFFF);
        if ret = WAIT_TIMEOUT then
          TerminateProcess(proc.hProcess, ret);
        endif;
        i = proc.hProcess;
    //    GetExitCodeProcess(proc.hProcess, ret);  
        CloseHandle(proc.hProcess);
      endif;
    end;
      

  2.   

    HANDLE hProc = OpenProcess(SYNCHRONIZE,false,dwProcessId);你试试用这个Open 出来的句柄看看?
      

  3.   

    function WinExecAndWait32(FileName:String; Visibility :integer):integer;
    var
      i:cardinal;
    StartupInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
    begin
    FillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := Visibility;
    if not CreateProcess(nil,pchar(filename),nil,nil,false,  CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then Result := -1
    else begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,i);
    result:=i;
    end;
    end;
    和你的基本一致,我测试没有问题,不信你试试我的函数