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



    
rambler's top100 Rambler's Top100