比如在窗体里单击一个按钮调用一个可执行程序(C:\a.exe),然后在该程序关闭后返回窗体界面.请给出具体代码。

解决方案 »

  1.   

    function WinExecAndWait32(FileName: string; Visibility: integer): Cardinal;
    var 
      zAppName: array[0..512] of char; 
      zCurDir: array[0..255] of char; 
      WorkDir: string; 
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation; 
    begin 
      StrPCopy(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,               { pointer to command line string } 
        nil,                    { pointer to process security attributes } 
        nil,                    { pointer to thread security attributes } 
        true,                   { handle inheritance flag } 
        CREATE_NEW_CONSOLE or   { creation flags } 
        NORMAL_PRIORITY_CLASS, 
        nil,                    { pointer to new environment block } 
        nil,                    { pointer to current directory name, PChar} 
        StartupInfo,            { pointer to STARTUPINFO } 
        ProcessInfo)            { pointer to PROCESS_INF } 
        then Result := INFINITE {-1} else 
      begin 
        WaitforSingleObject(ProcessInfo.hProcess, INFINITE); 
        GetExitCodeProcess(ProcessInfo.hProcess, Result); 
        CloseHandle(ProcessInfo.hProcess);  { to prevent memory leaks } 
        CloseHandle(ProcessInfo.hThread); 
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      WinExecAndWait32('c:\a.exe', SW_NORMAL);
    end;
      

  2.   


    function Execute(const Command: string; bWaitExecute: Boolean; bShowWindow: Boolean; PI: PProcessInformation): Boolean;
    var
      StartupInfo       : TStartupInfo;       
      ProcessInformation: TProcessInformation;
    begin
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      with StartupInfo do
      begin
        cb := SizeOf(TStartupInfo);
        dwFlags := STARTF_USESHOWWINDOW;
        if bShowWindow then
          wShowWindow := SW_NORMAL
        else
          wShowWindow := SW_HIDE;
      end;
      
      Result := CreateProcess(nil, PChar(Command),
        nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil,
        StartupInfo, ProcessInformation);
      
      if not Result then Exit;
      
      if bWaitExecute then
        WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
      
      if Assigned(PI) then
        Move(ProcessInformation, PI^, SizeOf(ProcessInformation));
    end;
      

  3.   

    谢谢各位大侠,问题已经解决,基本上是按照sysu兄的方法,以后还请多教我。