我在一个FORM上采用Shellexecute(Handle, nil, Pchar(EXEPath), nil, nil, SW_SHOWMAXIMIZED)来执行一个外部文件.我想程序在执行完这个外部EXE文件前不能进行任何其它的操作,并且在执行EXE文件前显示一个消息框提示"请稍候".也就是类似DELPHI中的SHOWMODEL那种功能似的.
  还有为什么执行的时候要等很久EXE文件才能显示出来.谢谢!

解决方案 »

  1.   

    用createprocess然后在调用函数waitforsingleobject等待就可以了
      

  2.   

    用这段代码就行了。如果需要一直等待的话,把TimeOut参数设置为-1(INFINITE)procedure ExecuteandWaitforProgTerminated(FileName: string; TimeOut: integer);
    var
      CmdLine     : array[0..512] of char;
      zCurDir     : array[0..255] of char;
      WorkDir     : string;  StartupInfo : TStartupInfo;
      ProcessInfo : TProcessInformation;
    begin
      StrPCopy(CmdLine, FileName);
      WorkDir := ExtractFilePath(FileName);
      StrPCopy(zCurDir, WorkDir);
      FillChar(StartupInfo, Sizeof(StartupInfo),#0);
      StartupInfo.cb          := Sizeof(StartupInfo);
      StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWNORMAL;
      if CreateProcess(nil,
                       CmdLine,
                       nil,
                       nil,
                       false,
                       CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                       nil,
                       zCurDir,
                       StartupInfo,
                       ProcessInfo) then
      begin
        WaitForSingleObject(ProcessInfo.hProcess, TimeOut);
      end;
    end;
      

  3.   

    raize 3里面有这样的控件要是你不想用它的话里面有源代码可以参考
      

  4.   

    PoolD(池龙) ( ) 信誉:99 
    ...
    还是不行啊.如果设为-1的话要把当前程序退了才执行的到EXE文件.而设为其它的则实现不了,大家还有没有更好的办法啊
      

  5.   

    你不是希望“我想程序在执行完这个外部EXE文件前不能进行任何其它的操作”吗?比如:ExecuteandWaitforProgTerminated('c:\winnt\notepad.exe', -1)
    可以在其它人关闭记事本之前确保你的程序处在等待的状态。你的要求是?
      

  6.   

    我的意思是比如现在我在执行A程序,A程序界面中有若干个按钮.每个按钮对应执行一个EXE文件,我的要求是现在按了A界面中的第一个按钮后程序就执行相对应的EXE,现在在A界面上就不能够再执行其它的任何操作了,也就是说按其它按钮应该无效,程序不再触发A界面上的任何事件,直到EXE文件执行完毕.
      

  7.   

    用 PoolD(池龙) ( ) 的代码然后,修改如下:if CreateProcess(nil,
                       CmdLine,
                       nil,
                       nil,
                       false,
                       CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                       nil,
                       zCurDir,
                       StartupInfo,
                       ProcessInfo) then
      begin
        self.enabled := false;   //这里
        WaitForSingleObject(ProcessInfo.hProcess, TimeOut);
       self.enabled := true;  //这里  end;
      

  8.   

    aiirii(ari-爱的眼睛) ( ) 信誉:372 :    self.enabled := false;   //这里
        WaitForSingleObject(ProcessInfo.hProcess, TimeOut);
       self.enabled := true;  //这里如果不要self.enabled := true;这一句,功能就实现了.但是加上这一句后又不行了.但是我在程序中把这一保有取了后,程序返回后整个界面就运行不了了.
      

  9.   

    用这个,ExecuteandWaitforProgTerminated(FileName: string; TimeOut: integer);,把 FileName 设置为完整路径,我这里用是没问题的。
      

  10.   

    实在不行你就自己弄个TIMER吧.来骗骗.