AppMutex不适用于Inno Setup

时间:2014-01-14 17:35:05

标签: c# mutex inno-setup

似乎AppMutex指令对我的安装脚本不起作用。 我按照这篇文章:http://www.jmedved.com/2012/06/mutex-for-innosetup/

这是我申请的C#代码:

private static string appGuid = "Loader";
...
bool createdNew;
var mutexSec = new MutexSecurity();
mutexSec.AddAccessRule(
    new MutexAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null),
        MutexRights.FullControl, AccessControlType.Allow));

using (var setupMutex = new Mutex(false, @"Global\"+appGuid, out createdNew, mutexSec))
{
    if (!createdNew)
    {
        MessageBox.Show(
             "Application already running.", "Loader", MessageBoxButtons.OK,
             MessageBoxIcon.Error);
        return;
    }
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Loader(args));
}

在Inno Setup脚本中我只有:

AppMutex=Loader

但是,如果应用程序正在运行,安装程序也可以运行。

我还试图检查是否确实存在互斥锁,因此使用进程资源管理器我查找了应用程序处理程序,我得到了这个:

AppMutex=Loader

Mutant    \BaseNamedObjects\Loader

我想念的是什么?

2 个答案:

答案 0 :(得分:3)

由于您已在应用程序的Global\命名空间中创建了互斥锁,因此您也应明确对Inno安装程序脚本中的AppMutex互斥锁名称执行相同的操作,因为互斥锁对象不是在如果省略名称空间前缀,则为global namespace。因此,使用此脚本行应该可以解决您的问题:

[Setup]
AppMutex=Global\Loader

答案 1 :(得分:0)

在Inno Setup的[设置]部分:

AppMutex=[mutex name]

在应用程序主窗体的类部分(form_Load之外):

Dim mutex As New System.Threading.Mutex(False, "[mutex name]")

(注意这是在vb中,而不是c#)