2014-01-14 1 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 сценарии установки я просто:

AppMutex=Loader 

Однако программа установки может работать также, если приложение работает.

Я также попытался проверить, если там действительно был мьютекс, так и с Process Explorer я искал обработчиков приложений и я получаю это:

AppMutex=Loader 

Mutant \BaseNamedObjects\Loader 

Что я пропустил?

+1

Я бы сказал, что вам не хватает префикса 'Global \' в вашей директиве 'AppMutex' v ALUE. Я сомневаюсь, что без этого префикса будут созданы мьютексы в глобальном пространстве имен. Поэтому я предпочел бы использовать «AppMutex = Global \ Loader». – TLama

+0

Это ответ! ответьте, поэтому я могу принять ваше решение. благодаря – Tobia

ответ

3

Поскольку вы создали мьютекс в Global\ пространства имен в вашем приложении, вы должны явно сделать то же самое и для имени AppMutex мьютекса в вашем сценарии установки Inno, поскольку объекты мьютекса не создаются в глобальном пространстве имен, если опустить префикс пространства имен , Таким образом, используя этот скрипт строку должно исправить вашу проблему:

[Setup] 
AppMutex=Global\Loader 
0

В [Setup] раздел Inno Setup в:

AppMutex=[mutex name] 

В классе секции главной формы приложения (за пределами Form_Load):

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

(обратите внимание, что это находится в vb, а не C#)

Смежные вопросы