我在工程代码中加入了程序是否已经运行的判断,如果程序已经运行则跳出对话框"是否退出程序?"按确定则退出,而退出的代码我用了ExitProcess(0); Application.Terminate;都不管用,程序照样运行得好好的,谁知道应该怎样退出?或者怎样让它触发formclose事件呢?

解决方案 »

  1.   


      hMutex := CreateMutex(nil, False, 'SSS');
      Ret := GetLastError;
      if Ret <> ERROR_ALREADY_EXISTS then
      begin
        Application.CreateForm(TFmMain, FmMain);
        Application.CreateForm(TFmAbout, FmAbout);
        Application.Run;
      end
      else
        Application.Terminate;
      ReleaseMutex(hMutex);
      

  2.   

      hMutex0 := CreateMutex(nil, true, 'model');
      Ret := GetLastError;
      if Ret <> ERROR_ALREADY_EXISTS then
      begin
        Application.Initialize;
        Application.CreateForm(TForm1, Form1);
        Application.Run;
      end
      else
      begin
        if Application.MessageBox('程序已经运行,是否退出?', '提示!', MB_OKCANCEL or MB_ICONWARNING or MB_DEFBUTTON2)=2 then exit;
        Application.Terminate;
        ReleaseMutex(hMutex0);
      end;我只是加了一个对话框,我试过去掉对话框提示也一样,程序还是无法退出,没有任何反应
      

  3.   

    检查下你的代码逻辑
    if Ret <> ERROR_ALREADY_EXISTS then
      begin
        Application.Initialize;
        Application.CreateForm(TForm1, Form1);
        Application.Run;
      end
      else
      begin
        if Application.MessageBox('程序已经运行,是否退出?', '提示!', MB_OKCANCEL or MB_ICONWARNING)=IDOK then 
          Application.Terminate
        else
        begin
          Application.Initialize;
          Application.CreateForm(TForm1, Form1);
          Application.Run;
        end;  
      end;  ReleaseMutex(hMutex0);
      

  4.   

    我说了和对话框那一句没有关系了,我注释掉它也是一样,问题就出在Application.Terminate这句根本不起作用,我新建一个程序试了也一样,你们自己都试过了吗?我用form1.close的话会跳出错误
      

  5.   

    理论上在工程文件中,只要不执行Application.Run,程序就会直接退出的。
    如果这样都不行,那么就来个狠得:var
      FPid: DWORD;
    begin
      GetWindowThreadProcessId(Application.Handle, FPid);
      WinExec(PAnsiChar('TASKKILL.EXE /F /PID ' + IntToStr(FPid)), 0)
    end;
      

  6.   

    我终于搞明白问题出在哪了,程序运行的时候判断是否已经运行过,如果已经运行,则要杀掉的是第一个实例,而不是自身(第2个),不知道怎样取得第1个互斥体的相关句柄或PID之类的信息呢?
      

  7.   

    如果你这样做的话,可以使用PostMessage的形式向第一个实例发送个消息。当然在程序中处理这个消息的函数,如果收到该消息就关闭。
    PS:为什么要关闭第一个实例呢?难不成你第二个实例和第一个不一样????