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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Hawk[BZ]
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 30.01.2004 (Пт) 20:14

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

Сообщение Hawk[BZ] » 16.02.2004 (Пн) 22:37

Как сделать чтобы программа не запускалась два раза? Как проверить что она уже запущена?

BOO
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 126
Зарегистрирован: 06.09.2003 (Сб) 14:23
Откуда: Саратовская обл. г.Энгельс

код

Сообщение BOO » 16.02.2004 (Пн) 23:34

Очень просто:
If App.PrevInstance Then End :P
Слушайте рок!

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 18.02.2004 (Ср) 2:40

К дополнению только скажу что мона еще msgbox добавить чтоб юзверя не злить, он и без этого готов весь мир разорвать!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2004 (Ср) 8:40

Добавлю ещё, что так блокируется запуск двух копий программы из одного exe-файла. Юзер может скопировать программу в другую папку и оттуда преспокойно запустить. Так что лучше сделать в программе какое-то поле с кодовым словом и при запуске второй копии искать это окно с этим словом среди запущенных окон. Осуществляется через API. Интересно? Тогда могу привести пример (может, кто-то сделает это за меня :roll:)
Последний раз редактировалось Amed 19.02.2004 (Чт) 5:09, всего редактировалось 1 раз.

Netta
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 25.11.2003 (Вт) 12:22
Откуда: Lithuanian

Сообщение Netta » 18.02.2004 (Ср) 10:38

Нужно задекларировать эти функции:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

И при запуске программы проверить:

If App.StartMode <> vbSModeStandalone Then
BlockLoad = True
Exit Sub
End If
If App.PrevInstance = True Then
Exit Sub
End If
' Is the main window already up?
OtherWnd = FindWindow(vbNullString, "Foreground Form ")
If OtherWnd <> 0 Then
' Make sure it's the same process - don't want
' to interfere with others
Call GetWindowThreadProcessId(OtherWnd, pid)
If pid = GetCurrentProcessId() Then
' Main window is up in the same process,
' so exit
Exit Sub
End If
End If

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 19.02.2004 (Чт) 1:31

Нужно задекларировать эти функции:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

И при запуске программы проверить:

If App.StartMode <> vbSModeStandalone Then
BlockLoad = True
Exit Sub
End If
If App.PrevInstance = True Then
Exit Sub
End If
' Is the main window already up?
OtherWnd = FindWindow(vbNullString, "Foreground Form ")
If OtherWnd <> 0 Then
' Make sure it's the same process - don't want
' to interfere with others
Call GetWindowThreadProcessId(OtherWnd, pid)
If pid = GetCurrentProcessId() Then
' Main window is up in the same process,
' so exit
Exit Sub
End If
End If



А зачем, кода все делаеться в одну строку.

(или я дурак, или ты из ума вижел?)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 19.02.2004 (Чт) 5:08

Amed писал(а):Добавлю ещё, что так блокируется запуск двух копий программы из одного exe-файла. Юзер может скопировать программу в другую папку и оттуда преспокойно запустить. Так что лучше сделать в программе какое-то поле с кодовым словом и при запуске второй копии искать это окно с этим словом среди запущенных окон. Осуществляется через API. Интересно? Тогда могу привести пример (может, кто-то сделает это за меня :roll:)

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 19.02.2004 (Чт) 9:23

С таким же упехом намного легче в //windows/temp можно содавать временный файл. при входе в прогу проверять его наличие, или содержимое.
А примерчик всеравно напиши, интересно. :D


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot и гости: 9

    TopList