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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Toxa
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 07.02.2005 (Пн) 16:21
Откуда: Питер

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

Сообщение Toxa » 07.02.2005 (Пн) 16:42

т.е. как проверить, что программа уже запущена?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.02.2005 (Пн) 16:43

App.PrevInstance
Изображение

Toxa
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 07.02.2005 (Пн) 16:21
Откуда: Питер

Сообщение Toxa » 07.02.2005 (Пн) 16:52

tyomitch писал(а):App.PrevInstance

Прошу прощения...нельзя ли по подробнее... :?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.02.2005 (Пн) 16:58

Код: Выделить всё
Private Sub Form_Load()
    If App.PrevInstance Then MsgBox "Уже был запущен" Else MsgBox "Ещё не был запущен"
End Sub
Изображение

Toxa
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 07.02.2005 (Пн) 16:21
Откуда: Питер

Сообщение Toxa » 07.02.2005 (Пн) 17:11

мне постоянно False выдает...даже если программу пятый раз запускаешь...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 07.02.2005 (Пн) 23:01

Toxa прав, у меня то же самое... Может, опять без API не обойтись? :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.02.2005 (Вт) 3:57

А у меня работает :)
Вот она, сила и превосходство Win98 :)

А вам тогда чё.... mutex создавать :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Amed » 08.02.2005 (Вт) 15:41

Да, по-правильному нужен Mutex.

Кстати, меня App.PrevInstance тоже работает (XP/SP2);)
Работать не будет, если запустить то же приложение из другого места.

API-Guide писал(а):'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

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.02.2005 (Вт) 15:47

может вы господа в своих проектах имеете процедуру Main для запуска приложения? так вставьте эту проверку в самое ее начало :)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.02.2005 (Вт) 15:49

у меня на любом компе работает App.PrevInstance, а что у вас за операционка такая?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.02.2005 (Вт) 18:16

Ребята, а вы, часом, не из-под IDE запускаете? Если да, то и не должно работать...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 08.02.2005 (Вт) 18:23

Нет, я компилил (в разные папки) :roll:

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 08.02.2005 (Вт) 18:41

Шото парни у Вас не так, работает спокойно... :wink:
Ми..и...и...и..р Вашему дому.............

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.02.2005 (Вт) 19:14

В разных папках работать не будет, т.к. разные полные пути. Эта штука работает только в пределах одного и того же ехе, из одного и того же места. Альтернатива - только мьютекс, как уже и было сказано...

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 08.02.2005 (Вт) 20:54

А можно поступить по ламерски... Если только очень приспичит...
При запуске проверять есть ли уже окно с таким именем, если да то End...
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.02.2005 (Вт) 23:13

Ennor писал(а):В разных папках работать не будет, т.к. разные полные пути. Эта штука работает только в пределах одного и того же ехе, из одного и того же места. Альтернатива - только мьютекс, как уже и было сказано...

Не только. Хоть атом, хоть окно необычного класса (по сути, тот же атом), хоть какие-нибудь именованные объекты (события, трубы, etc.)
Вариантов мульён, один хитрее другого ;-)
Изображение

HotKitten
Дятил
Дятил
Аватара пользователя
 
Сообщения: 400
Зарегистрирован: 24.01.2005 (Пн) 21:48
Откуда: из дома

Сообщение HotKitten » 10.02.2005 (Чт) 1:35

If App.PrevInstance = True Then
MsgBox "прога уже запущена!", 16, "Error"
End
End If

всё время этим кодом пользуюсь, в WinNT пашет
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.02.2005 (Чт) 6:05

HotKitten, первую страницу топика прочитай. Там как раз этот код обсуждается.
Изображение

Toxa
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 07.02.2005 (Пн) 16:21
Откуда: Питер

Сообщение Toxa » 10.02.2005 (Чт) 11:33

Господа, спасибо за ответы...
App.PrevInstance действительно работает, просто я второй раз пытался запускать прогу из VB...

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.02.2005 (Чт) 11:37

Посмотри пример на http://bbs.vbstreets.ru/viewtopic.php?p=62914#62914 - передача параметра в первую копию программы.
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 10.02.2005 (Чт) 12:58

Весь флейм из за того, что никто не знает, что понимается под "второй копией".

-Откуда она запускается?
Опа! Половина советов(включая App>PrevInstance) отпало.

- а программа содержит окна виндовс?
Опа! отпали варианты и с FindWindow

-Программу переименовали?
Опа! Просмотр процессов отпал!

оставшиеся варианты:
-По процессам, если в ЕХЕ зашито имя файла.

-Организация серверного прослушивания. Реализация на усмотрение.

ЗЫ: Возможно Вас устроит и первый вариант...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 10.02.2005 (Чт) 13:02

Amed писал(а):Да, по-правильному нужен Mutex.

Кстати, меня App.PrevInstance тоже работает (XP/SP2);)
Работать не будет, если запустить то же приложение из другого места.

API-Guide писал(а):'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



Интересный вариант, только:

-нафиг закрывать мютекс если он сорвался?

-а если прога вылетет по GPF или просто на мютекс не зарелизиться. Он останется?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.02.2005 (Чт) 15:42

2Sebas: мой пример с мэйлслотом проходит все три твоих "теста" (таймер можно заменить на класс), и не является ни одним из твоих "оставшихся вариантов".

Ещё, если владелец мутекса умирает (любым способом), то мутекс освобождается. Т.ч. мутексы здесь - самое то :-)

----------
If a thread terminates without releasing its ownership of a mutex object, the mutex object is considered to be abandoned. A waiting thread can acquire ownership of an abandoned mutex object, but the wait function's return value indicates that the mutex object is abandoned. It is best to assume that an abandoned mutex object indicates that an error has occurred and that any shared resource being protected by the mutex object is in an undefined state. If the thread proceeds as though the mutex object had not been abandoned, its "abandoned" flag is cleared when the thread releases its ownership. This restores normal behavior if a handle to the mutex object is subsequently specified in a wait function.
Изображение


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 169

    TopList