首页 > 解决方案 > 释放在同一应用程序中启动时创建的互斥锁

问题描述

我在我的应用程序开始时创建了一个互斥锁,主要是为了防止运行同一应用程序的 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 返回一个句柄,但是当我调用 ReleaseMutex 时,该函数返回 false。我应该如何关闭这个互斥锁?

标签: delphi

解决方案


您似乎使用互斥锁的存在作为标准来决定进程是否已经运行而不是谁拥有互斥锁。ReleaseMutex如果您当前拥有互斥锁,则用于放弃对互斥锁的所有权。但是您的代码实际上并没有在任何地方检索互斥锁的所有权。

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

  1. 销毁互斥体而不是试图释放它。

而不是使用ReleaseMutex,使用CloseHandle来破坏互斥锁。如果你是唯一一个持有互斥锁句柄的人,那么它之后就会消失。

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

  1. 按预期使用互斥锁

不要仅仅使用互斥体的存在,而是尝试通过调用WaitForSingleObject它来获得所有权。然后你可以通过调用来释放它ReleaseMutex

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

在尝试启动新实例之前,让外部程序等到应用程序的旧实例完全终止。


推荐阅读