主要目的是,sub.exe一旦被关闭,main.exe 也跟着被关闭。我把这个写到timer里的,一直在那循环,总感觉不对劲,是否有更先进的方法?在main.exe里写,如果进程里没sub.exe 就ExitProcess(0);

解决方案 »

  1.   

    最简单就用timer,但不用循环吧?把时间设短一点,然后监控sub.exe的进程句柄就可以了,一旦获取失败就退出。
      

  2.   

    如果 Main 和 Sub 都是你自己写的,那就很简单,你让 Sub 退出的时候给 Main 的一个窗口发个消息就行。
    如果 Main 是自己写的,而 Sub 不是自己写的,那么就上边的做法
    如果 Main 不是自己写的而 Sub 是自己写的,那么就 Sub 退出的时候先FindWindow找出 Main 的主窗口给发个 WM_CLOSE 消息过去
      

  3.   

    SUB.exe程序中:
    一、调用Main.EXE时,记下它的句柄。
      ExeHandle:=findWindow(nil,'窗口名称');         // 返回EXE句柄
    or
      shellexecute(exehandle,'open',pchar('main.exe'),'',nil,sw_shownormal);二、退出时,关闭该句柄的线程。
      if ExeHandle<>0 then
      begin
        SendMessage(EXEHandle,WM_Close,0,0);    // 向EXE发送关闭消息
        ExeHandle:=0;
      end;
      

  4.   

    如果都是DELPHI写的有种很简单的办法,直接写一个回调函数(callback)1.MainForm编写一个
    procedure MainForm.CallBackClose(Sender:TOBject);
    begin
      try
        Self.Free
      except
      end;
    end;
    2.subForm加入回调代码
    增加回调函数类型
    type
      TCallBackClose:procedure (Sender:TOBject) of object;
    ....
    var
      CallBackMain:TCallBackClose;
    ....
    在SubForm关闭的事件中加入
      CallBackMain(SELF);
    3.MainForm启动SUBFORM的时候记下HANDLE
    4.通过HANDLE找到SUBFORM
    5.将MainForm的CallBackClose传递给SUBFORM
    TForm(subFormHWND).CallBackMain:=CallBackClose;这样,就不需要线程、不需要消息、不需要TIMER去监听了,只要SUBFORM CLOSE或是你想要关闭MainForm的时候,执行CallBackMain(SELF) MAINFORM就CLOSE