2014-01-14 26 views
3

似乎AppMutex指令不适用于我的安装脚本。 我遵循这个文章:http://www.jmedved.com/2012/06/mutex-for-innosetup/AppMutex在Inno Setup上不起作用

这是我的应用我的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 

我错过了什么?

+1

我想说你在'AppMutex'指令val中缺少'Global \'作用域前缀UE。我怀疑没有这个前缀会在全局命名空间中创建互斥锁。所以我宁愿使用'AppMutex = Global \ Loader'。 – TLama

+0

这就是答案!请回答,以便我可以接受您的解决方案。谢谢 – Tobia

回答

3

既然你已经在你的应用程序中创建互斥量在Global\命名空间,你应该明确地做同样也为您的Inno Setup的脚本AppMutex互斥体的名称,因为如果省略命名空间前缀未在全局命名空间中创建的互斥对象。因此,使用这个脚本行应该解决您的问题:

[Setup] 
AppMutex=Global\Loader 
0

在创新安装的[设置]部分:

AppMutex=[mutex name] 

在应用程序的主窗体类节(的Form_Load外):

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

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