Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Запрет повторного запуска приложения Добавлено: 09.10.07 17:03  

Автор вопроса:  Иван | Web-сайт: www.harami.ru
Уважаемые гуру!
Нашел на форуме несколько примеров, как запретить повторный запуск приложения. Везде создается массив из названий окон, используются API-функции, и т.д.
Подскажите, пожалуйста, чем хуже нижеприведенный код? Результат тот же, а писанины вдесятеро меньше.
Заранее благодарен.

Запуск из модуля:

Sub Main()
On Error GoTo ErrHandler
AppActivate("Мое приложение")
Exit Sub
Nxt1:
On Error GoTo 0
'Здесь команды, необходимые для подготовки запуска приложения
Form1.Show
Exit Sub
ErrHandler:
Resume Nxt1
End Sub

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 altrego



ICQ: 244-611-814 

Вопросов: 3
Ответов: 28
 Web-сайт: www.v2.i-diot.net
 Профиль | | #1
Добавлено: 09.10.07 17:51
А как на счет:
Private Sub Form_Load()
If App.PrevInstance Then End
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #2 Добавлено: 10.10.07 00:28
Иван, ты написал AppActivate("Мое приложение";). Какое окно активирует данная процедура, если окон с таким названием больше одного? Конечно-же первое попавшееся, а надо - окно твоей программы.

Для запрета запуска копии программы (из любого места, в отличие от If App.PrevInstance Then End) используй следующий код:
'Code by Adam Verwijs
Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub Form_Load()
    Dim hMutex As Long
    'Try to create a new Mutex
    hMutex = CreateMutex(ByVal 0&, 1, App.Title)
    'Did the mutex already exist?
    If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
        'Clean up
        ReleaseMutex hMutex
        CloseHandle hMutex
        'More than one instance detected
        MsgBox "More than one instance"
        End
    Else
        'form load code
    End If
End Sub

Ответить

Номер ответа: 3
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #3 Добавлено: 10.10.07 01:13
P.S.: Для активации окна используй API-функцию FindWindow

Ответить

Номер ответа: 4
Автор ответа:
 Иван



Вопросов: 34
Ответов: 53
 Web-сайт: www.harami.ru
 Профиль | | #4
Добавлено: 10.10.07 22:04
Спасибо большое за помощь!

К слову:

Какое окно активирует данная процедура, если окон с таким названием больше одного? Конечно-же первое попавшееся, а надо - окно твоей программы.


Я эту проблему решал топорно: в названии окна моего приложения заменял русские буквы латинскими с таким же начертанием (р, с, е, и т.п.) — чтоб приложение было "уникальным". Кстати, эта проблема не решалась и в тех примерах, которые я до этого находил на форуме.

Еще раз огромное спасибо!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам