2013-06-04 2 views
-1

Я разрабатываю приложение для Windows. Я хочу, чтобы это приложение работало несколько в одной ОС. (например, мы можем запускать несколько экземпляров notepad.exe, calc.exe в то же время ... но я не хочу этого) Каков наиболее эффективный способ реализовать это? (Предотвращение нескольких экземпляров процесса, выполняющегося на то же самое время)Как предотвратить загрузку нескольких программ в Windows?

Я предпочел бы не использовать такие методы, как проверка имен процессов или обмена некоторый глобальный файл как сигнал ... так как это слишком легко обойти

спасибо заранее

ответ

0

Это обычно выполняются с помощью мьютексов. Когда ваш процесс запускается, вы вызываете CreateMutex и проверяете возвращаемое значение. Если это сработает, это первый запуск, иначе будет еще один экземпляр вашего процесса. Ваш мьютекс должен находиться в пространстве имен Global\. Также убедитесь, что ReleaseMutex, когда ваша программа заканчивается.

+0

Разве этот ответ не делает предположений о lanuguage/framework? – eidsonator

+0

спасибо! но моя программа многопоточена, и я уже использую мьютекс в качестве критического управления разделами ... это будет проблемой? – daehee

0

Вы упомянули вы не хотите, чтобы проверить текущие имена процессов или использовать глобальный файл.

Блокировка текущего выполняемого

.NET Пример кода:

 System.IO.File.Open(
      System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName, 
      System.IO.FileMode.Open, 
      System.IO.FileAccess.Read, 
      System.IO.FileShare.None); 

FileShare.None держит любой другой процесс (например, Windows Explorer,) от выполнения файла до тех пор, пока приложение закрывается или файл handle (возвращенный объект) явно закрыт.

Global мьютекса

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411%28v=vs.85%29.aspx

Если мьютекс именованный мьютекс и объект существовал до этого вызова функции , возвращаемое значение является дескриптор существующего объекта, GetLastError возвращает ERROR_ALREADY_EXISTS, bInitialOwner игнорируется, и вызывающему потоку не предоставляется право собственности. Однако, если вызывающий абонент имеет ограниченные права доступа, функция завершится с ERROR_ACCESS_DENIED, и вызывающий абонент должен использовать функцию OpenMutex.

Глобальный мьютекс - самый простой способ. Чтобы прояснить другой ответ, вы не просто проверяете возвращаемое значение, которое вы также проверяете на значение GetLastError.

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