(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Проблема повторного запуска приложений

Источник: vbrussian
Борис Файфель

Время от времени у программистов возникает вопрос как предотвратить повторный запуск программы. Это, конечно, не такой "вечный" вопрос, как проблема помещения иконки "туда, где часики", но возникает он регулярно. Предлагаются самые разные решения: от поиска уже созданного окна приложения до файлов-меток и использования PrevInstance. Каждый из этих методов имеет свои недостатки. Предлагаю почти идеальный метод распознавания уже запущенного приложения - использование семафора. Способ прост и лаконичен. Он позволяет распознать, что приложение уже запущено. А дальше все зависит от Вас: хотите не допустить повторный запуск - гасите вторую копию. А может быть нужно, чтобы некие действия выполнялись только первым экземпляром приложения - да нет проблем! И при этом не требуется громоздкого перечисления окон, не нужны файлы... В общем, сплошные плюсы. 
 Что же такое семафор? Это объект операционной системы, предназначенный для совместного управления различными ресурсами ОС. Семафор может находиться в двух состояниях: "свободен" и "занят". С семафором связан счетчик ресурсов. Для занятого семафора он имеет нулевое значение, для свободного - положительное. Семафор можно использовать совместно с функцией WaitForSingleObject для ожидания освобождения семафора. 
 Но нам не требуется ждать освобождения семафора. Достаточно попытаться создать семафор функциейCreateSemaphore, а затем просто проанализировать код ошибки. Если семафор создан успешно - запускается первый экземпляр. Если возникла ошибка - экземпляр не первый. И это все. Осталось только не забыть освободить семафор вызовом функции ReleaseSemaphore перед завершением приложения. 
Однако, к делу! Создаем VB-проект - обычный Exe-файл. Добавляем форму. Сажаем на форму кнопку, пишем на ней "Закрыть". Задаем обработчик нажатия кнопки, а также обработчик события QueryUnload для формы: 

Private Sub Command1_Click()
If (semHNDL <> 0) Then RC& = ReleaseSemaphore(semHNDL, 1, CC&)
End
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If (semHNDL <> 0) Then RC& = ReleaseSemaphore(semHNDL, 1, CC&)
Cancel = 0
End Sub

Добавляем к проекту модуль. В область кода заносим: 
Public Declare Function CreateSemaphore Lib "kernel32" _
Alias "CreateSemaphoreA" _
(ByVal lpSemaphoreAttributes As Long, _
       ByVal lInitialCount As Long, _
       ByVal lMaximumCount As Long, _
       ByVal lpName As String) As Long

Public Declare Function ReleaseSemaphore Lib "kernel32" _
       (ByVal hSemaphore As Long, _
       ByVal lReleaseCount As Long, _
       lpPreviousCount As Long) As Long

Global semHNDL As Long

Sub Main()
Err.Clear
semHNDL = CreateSemaphore(0, 0, 1, "Cats_Tail")
RC& = Err.LastDllError
If (RC& <> 0) Or (semHNDL = 0) Then
       '::: Это - не первый экземпляр
       MsgBox "Повторный запуск!"
    End
    End If
Form1.Show
End Sub

Для нашего проекта устанавливаем startup-объект - "SUB MAIN". Транслируем. Если теперь запустить полученный exe-файл, появится наша формочка с кнопкой "Закрыть". А теперь попробуйте запустить второй экземпляр exe-файла. Как Вы думаете, что произойдет? Правильно: выйдет сообщение "Повторный запуск". Вы можете копировать exe-файл в любую директорию (в т.ч. и в сеть). Запустить второй экземпляр все равно не удастся.
 Имейте в виду, что семафор привязан к процессу. Если Вы будете запускать проект из среды VB, то семафор не будет уничтожен до тех пор, пока Вы не закроете IDE. 
 Имя семафора (в нашем случае - строка "Cats_Tail") может быть любым разумным. 
 У меня этот фрагмент кода работает с 2002 года на добрых двадцати рабочих местах. Ошибок и проблем пока не возникало! 
 Подробности использования семафоров - в знаменитой "Библии" API Дана Эпплмана. Еще одна неплохая книга на эту тему - "Программирование в Win32 API на Visual Basic" Стивена Романа.
 
Готовый пример можно скачать здесь.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 19.07.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Windows Professional 10, Электронный ключ
Microsoft 365 Apps for business (corporate)
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft 365 Business Basic (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Вопросы и ответы по MS SQL Server
Все о PHP и даже больше
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100