Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 | 3 |

 

  Вопрос: Повторный запуск приложения Добавлено: 23.11.07 14:00  

Автор вопроса:  - MaAs† -™ | ICQ: 233628153 
Доброго всем времени суток!
Во многих программах есть такая фича - если попробовать запустить два приложения, то второе пишет мол первое уже запущено.
Вопрос - как именно оно определяет это? Например, поиск таких же заголовков форм всех приложений в данном случае не пойдет, его в программе нет. Плюс программа может находится в разных папках. Что делать? Гугл не помог, видно руки кривые...

Ответить

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

Номер ответа: 1
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #1
Добавлено: 23.11.07 14:29
http://kbyte.ru/Samples/Show.aspx?id=143
http://kbyte.ru/Forum/Show.aspx?id=578

Ответить

Номер ответа: 2
Автор ответа:
 Retupa



Вопросов: 1
Ответов: 51
 Профиль | | #2 Добавлено: 23.11.07 15:21
Думаю тс имел ввиду не совсем это. App.PrevInstance поможет только для запуска одного приложения, достаточно сделать копию и запускать...
- MaAs† -™, как именно оно определяет это неизвестно ) В каждом случае по разному.. Можно создать запись в реестре и проверять её значение при запуске, или открыть\создать файл с блокировкой чтения и записи при старте. (файл должен быть создан и находиться в системной папке, например - темп) или искать в прцессах своё предыдущие приложение...

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 23.11.07 16:37
Pipe

Ответить

Номер ответа: 4
Автор ответа:
 Stuart



Вопросов: 5
Ответов: 152
 Профиль | | #4 Добавлено: 23.11.07 20:24
Если ты хочеш сделать чтобы твоё приложение не льзя было запустить несколько раз, то вот помести этот код в автозагрузку.

If App.PrevInstance Then
MsgBox "Уже запущено"
Unload Me
End If

А как это работает хз, можно много вариантов рассматривать.
А зачем тебе это надо знать, просто любопытство или что то другое? :-)

Ответить

Номер ответа: 5
Автор ответа:
 - MaAs† -™



ICQ: 233628153 

Вопросов: 13
Ответов: 29
 Профиль | | #5 Добавлено: 23.11.07 22:22
Нет, это нужно для клиентской части приложения некоего грядущего интернет-сервиса 8) А то нехорошо получается когда с одного компа юзер пытается зайти со второй программы, почему именно так - долго обьяснять.

ЗЫ: App.PrevInstance работает на ура, но только если просто повторно запустить из той же папки, если запустить копию то не работает, потому спасибо всем за подсказки, буду думать 8)

Ответить

Номер ответа: 6
Автор ответа:
 Stuart



Вопросов: 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 "Ну и кого ты решил на**ать? :)", 64, "А вот и не запустиш!!"
   Unload Me
 End If

End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Stuart



Вопросов: 5
Ответов: 152
 Профиль | | #7 Добавлено: 24.11.07 00:14
Т.е. имя программы твоей "MyProg" если ей переименовать во чтонить другое то не запустится она. Криво комментарии написал, и происходит это от того что ночью нужно спать а не на форумах сидеть :)

Ответить

Номер ответа: 8
Автор ответа:
 - MaAs† -™



ICQ: 233628153 

Вопросов: 13
Ответов: 29
 Профиль | | #8 Добавлено: 24.11.07 01:30
Спс, респект 8)

Ответить

Номер ответа: 9
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #9
Добавлено: 24.11.07 04:21
Мдя, не те линки дал :) Вот оно, то что нужно http://kbyte.ru/forum/show.aspx?id=2317 --> http://kbyte.ru/Unicode/ShowCode.aspx?id=89

Ответить

Номер ответа: 10
Автор ответа:
 Retupa



Вопросов: 1
Ответов: 51
 Профиль | | #10 Добавлено: 24.11.07 04:50
Stuart, а если копировать прогу в др. папку, не меняя имени...

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 24.11.07 14:39
Pipe

Ответить

Номер ответа: 12
Автор ответа:
 Stuart



Вопросов: 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 "Ну и кого ты решил на**ать? :)", 64, "А вот и не запустиш!!"
   End
 End If

End Sub

Ответить

Номер ответа: 13
Автор ответа:
 Stuart



Вопросов: 5
Ответов: 152
 Профиль | | #13 Добавлено: 24.11.07 14:49
Если надо, Могу так же пример написать, как можно запретить Повторный запуск приложения через Реестр. Но я думаю это не к чему:-)

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 24.11.07 17:15
ну или Mutex
симафор.. бла да шо угодно, но вариант Stuart мне нравится больше всего!!! :))

P.S. Мне тоже плз скиньте чертежи того бульбулятора!!!

Ответить

Номер ответа: 15
Автор ответа:
 Retupa



Вопросов: 1
Ответов: 51
 Профиль | | #15 Добавлено: 25.11.07 07:40
Stuart, а если изменить расширение проги не меняя имени... Например, MyProg.com

Ответить

Страница: 1 | 2 | 3 |

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



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