问题一:我想实现如下功能:
在一个程序中调用另一个exe文件,并传参数,都已成功,但现在有一个问题就是:
我想调用b.exe后,执行b.exe的一个过程RunProc,我在FormShow事件中调用这个过程,得到的结果却是该过程执行完了我才看到Form打开,请问怎么样才能Form打开后看着RunProc执行,
是不是不应该在FormShow事件中调用该过程?
不知大家明白我的意思否?帮帮忙,谢谢!(附代码)
//调用b.exe
procedure TFormCall.Button1Click(Sender: TObject);
begin
  shellexecute(handle,'open','b.exe','x','',sw_shownormal);
end;
//取参数并执行过程RunProc
procedure TMainForm.FormShow(Sender: TObject);
var pam:string;
begin
   pam:=paramstr(1);
   if pam='x' then
     RunProc; //执行一个过程 
end;
问题二:
  如何在调用b.exe之前判断b.exe是否在运行,如果正在运行,则关闭b.exe?现在最急是解决第一个问题!

解决方案 »

  1.   

    二、
    在调用b.exe前
    var
      th:hwnd;
    begin
       th:=0;
       th:=findwindow(nil,b.exe的标题);
       if th<>0 then
          begin
            sendmessage(th,wm_close,0,0);
          end
        else
         begin
          shellexecute();
        end;
      

  2.   

    1-》
    使用匿名管道通知b.exe,b.exe自己调用RunProc.2-》
    使用互斥对象
      

  3.   

    你在下面执行:
    procedure TForm1.FormActivate(Sender: TObject);
    var pam:string;
    begin
       pam:=paramstr(1);
       if pam='x' then
         RunProc; //执行一个过程 
    end;
      

  4.   

    第一个问题:
    在b.exe的mainform上放个定时器,interval设为500,enable默认为false,formshow时将定时器enable为true。
    在定时器的事件内第一句将enable改为false,然后执行runproc即可第二个问题,简单的方法,你可以在a.exe中用windows api:FindWindow
    第一个参数传你的b.exe的MAINFORM的类名,第二个参数可传nil值。
    建议你看一下FindWindow的帮助。
      

  5.   

    自定义一条消息,在这个消息处理方法中调用b.exe
    shellexecute(handle,'open','b.exe','x','',sw_shownormal);然后在窗体的OnShow里
    发送这个消息就可以了
    SendMessage 是等b.exe运行结束,再运行下面的代码PostMessage 则把消息发送出去后,立刻往下执行
      

  6.   

    在form的onCreate中加入procedure TForm1.FormCreate(Sender: TObject);
    begin
     self.Show;
     self.Repaint;
     Application.ProcessMessages;
    end;
      

  7.   

    第二個問題, 很多解法, 簡單點的:
    var H: THandle;
    begin
       h := findwindow(nil,b.exe的标题);
       if h>0 then
          sendmessage(h,wm_close,0,0);
       Application.ProcessMessages;
       ...
      ShellExecute(...)