释放在同一应用程序中启动时创建的互斥锁

Releasing a mutex created on startup within the same application

我在我的应用程序开始时创建了一个互斥锁,主要是为了防止 运行 同一应用程序的 2 个实例。

  if CreateMutex(nil,false,'Proton Studio') = 0 then
    RaiseLastOSError;
  if GetLastError = ERROR_ALREADY_EXISTS then exit;

但是,当我重新配置我的应用程序时,我需要在关闭应用程序之前释放互斥量,以便启动一个短程序,然后重新启动我的应用程序。

  hw := OpenMutex(MUTEX_ALL_ACCESS, false, 'Proton Studio');
  if ReleaseMutex(hw)then begin
    if ShellExecute(application.Handle, 'open',
    Pchar('StudioRestart.exe'), PChar(Application.ExeName),'', SW_SHOWNORMAL) > 32 then
      fmIDEMain.Close
    else
      ShowMessage('Unable to Restart, please close and restart manually')
  end

OpenMutex returns 一个句柄但是当我调用 ReleaseMutex 函数时 returns false。我应该如何关闭这个互斥体?

您似乎使用存在互斥量作为判断进程是否已经运行而不是拥有互斥量的标准. ReleaseMutex 用于放弃对互斥量的所有权(如果您当前拥有它)。但是您的代码实际上并没有在任何地方检索互斥体的所有权。

我看到了这些解决问题的方法:

  1. 销毁互斥量而不是尝试释放它。

不使用ReleaseMutex,而是使用CloseHandle来销毁互斥体。如果您是唯一持有互斥锁句柄的人,那么它会在之后消失。

为此,请记住 CreateMutex 返回的原始句柄,不要再次打开互斥量。

  1. 按预期使用互斥体

不要只使用现有的互斥量,而是尝试通过调用 WaitForSingleObject 来获取所有权。然后您可以通过调用 ReleaseMutex.

来释放它
  1. 外部程序应该等待(我的首选方法)

让外部程序等到应用程序的旧实例完全终止后再尝试启动新实例。