|
|
|||||||||||||||||||||||||||||
|
Проблема повторного запуска приложенийИсточник: vbrussian Борис Файфель
Время от времени у программистов возникает вопрос как предотвратить повторный запуск программы. Это, конечно, не такой "вечный" вопрос, как проблема помещения иконки "туда, где часики", но возникает он регулярно. Предлагаются самые разные решения: от поиска уже созданного окна приложения до файлов-меток и использования PrevInstance. Каждый из этих методов имеет свои недостатки. Предлагаю почти идеальный метод распознавания уже запущенного приложения - использование семафора. Способ прост и лаконичен. Он позволяет распознать, что приложение уже запущено. А дальше все зависит от Вас: хотите не допустить повторный запуск - гасите вторую копию. А может быть нужно, чтобы некие действия выполнялись только первым экземпляром приложения - да нет проблем! И при этом не требуется громоздкого перечисления окон, не нужны файлы... В общем, сплошные плюсы. 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" Стивена Романа. Готовый пример можно скачать здесь. Ссылки по теме
|
|