Вопрос: Повторный запуск приложения | Добавлено: 23.11.07 14:00 |
Автор вопроса: ![]() |
Доброго всем времени суток!
Во многих программах есть такая фича - если попробовать запустить два приложения, то второе пишет мол первое уже запущено. Вопрос - как именно оно определяет это? Например, поиск таких же заголовков форм всех приложений в данном случае не пойдет, его в программе нет. Плюс программа может находится в разных папках. Что делать? Гугл не помог, видно руки кривые... |
Ответы | Всего ответов: 42 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() black admin ICQ: 261779681 Вопросов: 87 Ответов: 633 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 23.11.07 14:29 |
http://kbyte.ru/Samples/Show.aspx?id=143
http://kbyte.ru/Forum/Show.aspx?id=578 |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 51 |
Профиль | Цитата | #2 | Добавлено: 23.11.07 15:21 |
Думаю тс имел ввиду не совсем это. App.PrevInstance поможет только для запуска одного приложения, достаточно сделать копию и запускать...
- MaAs† -™, как именно оно определяет это неизвестно ) В каждом случае по разному.. Можно создать запись в реестре и проверять её значение при запуске, или открыть\создать файл с блокировкой чтения и записи при старте. (файл должен быть создан и находиться в системной папке, например - темп) или искать в прцессах своё предыдущие приложение... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #3 | Добавлено: 23.11.07 16:37 |
Pipe |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() Вопросов: 5 Ответов: 152 |
Профиль | Цитата | #4 | Добавлено: 23.11.07 20:24 |
Если ты хочеш сделать чтобы твоё приложение не льзя было запустить несколько раз, то вот помести этот код в автозагрузку.
If App.PrevInstance Then MsgBox "Уже запущено" Unload Me End If А как это работает хз, можно много вариантов рассматривать. А зачем тебе это надо знать, просто любопытство или что то другое? ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 233628153 Вопросов: 13 Ответов: 29 |
Профиль | Цитата | #5 | Добавлено: 23.11.07 22:22 |
Нет, это нужно для клиентской части приложения некоего грядущего интернет-сервиса 8) А то нехорошо получается когда с одного компа юзер пытается зайти со второй программы, почему именно так - долго обьяснять.
ЗЫ: App.PrevInstance работает на ура, но только если просто повторно запустить из той же папки, если запустить копию то не работает, потому спасибо всем за подсказки, буду думать 8) |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() Вопросов: 5 Ответов: 152 |
Профиль | Цитата | #6 | Добавлено: 24.11.07 00:10 |
ЗЫ: App.PrevInstance работает на ура, но только если просто повторно запустить из той же папки, если запустить копию то не работает, потому спасибо всем за подсказки, буду думать 8)
Сделай тогда так, чтобы твою программу нельзя было переименовать а если всё таки и переименуют то не смогут запустить ![]() Private Sub Form_Load() If App.EXEName = "MyProg" Then 'MyProg имя программы скомпилированной MyProg.exe If App.PrevInstance Then 'чтобы нельзя было запускать несколько раз MsgBox "Уже запущено" Unload Me End If Else MsgBox "Ну и кого ты решил на**ать? ![]() Unload Me End If End Sub |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() Вопросов: 5 Ответов: 152 |
Профиль | Цитата | #7 | Добавлено: 24.11.07 00:14 |
Т.е. имя программы твоей "MyProg" если ей переименовать во чтонить другое то не запустится она. Криво комментарии написал, и происходит это от того что ночью нужно спать а не на форумах сидеть ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 233628153 Вопросов: 13 Ответов: 29 |
Профиль | Цитата | #8 | Добавлено: 24.11.07 01:30 |
Спс, респект 8) |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() black admin ICQ: 261779681 Вопросов: 87 Ответов: 633 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 24.11.07 04:21 |
Мдя, не те линки дал ![]() |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 51 |
Профиль | Цитата | #10 | Добавлено: 24.11.07 04:50 |
Stuart, а если копировать прогу в др. папку, не меняя имени... |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #11 | Добавлено: 24.11.07 14:39 |
Pipe |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 5 Ответов: 152 |
Профиль | Цитата | #12 | Добавлено: 24.11.07 14:44 |
Stuart, а если копировать прогу в др. папку, не меняя имени.. Да действительно вчера я это непродумал. Но за то сейчас продумал всё! ![]() Вот еще один примерчик к сожелению я его не так уж и быстро написал как предыдущий, но главное он работает, а работает он следующим образом: сканирует процессы и если он найдет 2 процесс в моем случае программа называется MyProg.exe то программа незапустится воть. Если переименовать прогу то тоже не чего не выйдет. А вот и код: Const TH32CS_SNAPPROCESS As Long = 2& Const MAX_PATH As Integer = 260 Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Private Declare Function ProcessFirst Lib "Kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "Kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long) Private Sub Form_Load() If App.EXEName = "MyProg" Then 'MyProg имя программы Dim hSnapShot As Long Dim uProcess As PROCESSENTRY32 Dim r As Long hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0& ![]() If hSnapShot = 0 Then Exit Sub End If uProcess.dwSize = Len(uProcess) r = ProcessFirst(hSnapShot, uProcess) Do While r Form1.Caption = uProcess.szExeFile If Form1.Caption = "MyProg.exe" Then m = m + 1 If Form1.Caption = "MyProg.eXe" Then m = m + 1 If Form1.Caption = "MyProg.EXe" Then m = m + 1 If Form1.Caption = "MyProg.EXE" Then m = m + 1 If Form1.Caption = "MyProg.eXE" Then m = m + 1 r = ProcessNext(hSnapShot, uProcess) Loop Call CloseHandle(hSnapShot) If m = 2 Then MsgBox "Прога уже запущена", 16, "БАХ!" End End If Else MsgBox "Ну и кого ты решил на**ать? ![]() End End If End Sub |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() Вопросов: 5 Ответов: 152 |
Профиль | Цитата | #13 | Добавлено: 24.11.07 14:49 |
Если надо, Могу так же пример написать, как можно запретить Повторный запуск приложения через Реестр. Но я думаю это не к чему![]() |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #14 | Добавлено: 24.11.07 17:15 |
ну или Mutex
симафор.. бла да шо угодно, но вариант Stuart мне нравится больше всего!!! ![]() P.S. Мне тоже плз скиньте чертежи того бульбулятора!!! |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 51 |
Профиль | Цитата | #15 | Добавлено: 25.11.07 07:40 |
Stuart, а если изменить расширение проги не меняя имени... Например, MyProg.com |
|