似乎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
我想念的是什么?
答案 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#)