Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: Запрет на повторный запуск приложения! Добавлено: 27.02.06 01:40  

Автор вопроса:  Albert | ICQ: 334-970-670 

Ответить

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

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


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #16 Добавлено: 28.02.06 17:53
FindWindow будет быстрее чем получение списка процессов...

Ответить

Номер ответа: 17
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #17
Добавлено: 28.02.06 17:58
Тогда уж проще получить список запущенных процессов. Если такой уже имеется - выгружаемся нафиг.

А если твоя программа называется svhost.exe :))) Не это плохой способ, имхо :)

2ANDREY
или светофоры

Светофоров нема... а вот семафоры имеюцца...

2Sacred Phoenix, это все объекты ядра, используются для синхронизации потоков... Вот только программисты об этом "не знают" и используют их для всего чего попало :) Так что разницы особой нет ;)

Ответить

Номер ответа: 18
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #18 Добавлено: 28.02.06 18:02
Быстрее то да, но тут везде свои недостатки.
При FindWindow нужно искать нестрогое соответствие, поскольку Caption меняется. То есть, либо через Left$, либо InStr, но тут нет гарантии что поиск не пересечется с другим случайным окном.
Для получения списка процессов - сложновато будет определить схожий процесс при переименовании exe файла.
Через mutex все бы хорошо, но при "неформальном" завершении программы перезапустить её будет проблематично.
В общем, кому что. Я обычно пользовался процессами, но у меня задача была другая - загасить не вновь запускаемое, а ранее запущенное приложение.

Ответить

Номер ответа: 19
Автор ответа:
 ANDREY



Вопросов: 0
Ответов: 33
 Профиль | | #19 Добавлено: 28.02.06 18:13
2Sacred Phoenix, это все объекты ядра, используются для синхронизации потоков... Вот только программисты об этом "не знают" и используют их для всего чего попало :)

Особенно те объекты, про которые в MSDN написано
You can use a mutex object to protect a shared resource from simultaneous access by multiple threads or processes.
?
Через mutex все бы хорошо, но при "неформальном" завершении программы перезапустить её будет проблематично.
Опять же
The system closes the handle automatically when the process terminates
. Так что в чем будет проблема?

Ответить

Номер ответа: 20
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #20 Добавлено: 28.02.06 18:55
Проблема в том что процесс может остаться в памяти. И хэндлы закрыты не будут.
В принципе, то же можно сделать и через CreateEvent. Тут главная проблема - отследить наличие работающего приложения. Хотя тут уже вопрос в том, насколько криворуко оно написано.

Ответить

Номер ответа: 21
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #21
Добавлено: 28.02.06 18:55
не знают - в кавычках ;)

Ответить

Номер ответа: 22
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #22
Добавлено: 28.02.06 18:56
не знают - в кавычках ;)

Ответить

Номер ответа: 23
Автор ответа:
 ANDREY



Вопросов: 0
Ответов: 33
 Профиль | | #23 Добавлено: 28.02.06 19:03
В принципе, то же можно сделать и через CreateEvent
А вот тут нельзя :) Event'ы, на сколько я знаю, это объекты исключительно "внутрипроцессной" синхронизации. Соответственно в нашем случае не подойдут...

Ответить

Номер ответа: 24
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #24
Добавлено: 28.02.06 19:04
    invoke CreateMutex, NULL, FALSE, offset szCaption
    invoke GetLastError
    .if (eax == ERROR_ALREADY_EXISTS)
        invoke MessageBox, 0, 0, 0, 0
    .endif
    jmp $


Пара строчек и спора нет ;) Убивал как положено из Диспетчера задач :)

Ответить

Номер ответа: 25
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #25
Добавлено: 28.02.06 19:05
ЗЫ
После убийства процесса:
eax != ERROR_ALREADY_EXISTS

Ответить

Номер ответа: 26
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #26 Добавлено: 28.02.06 19:19
А вот тут нельзя

http://forum.ixbt.com/post.cgi?id=print:40:682

Ответить

Номер ответа: 27
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #27
Добавлено: 28.02.06 19:44
:) У них у фсех устарефшая ферсия финдофса :))

Ответить

Номер ответа: 28
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #28
Добавлено: 28.02.06 21:41
Чтобы не было проблем с заголовком окна, можно создать отдельное невидимое окошечко с чем-нибудь хорошим на заголовке. Можно GUIDGen заюзать.
С окошечком, пожалуй, самое надежное.

ЗЫ. Но если кто-то действительно захочет запустить две копии - так пусть запускает. Жалко чтоли, если у него от этого что-то плохое произойдет? Сам ведь виноват будет, нефиг было лазить где не положено.

Ответить

Номер ответа: 29
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #29 Добавлено: 28.02.06 22:36
можно создать отдельное невидимое окошечко с чем-нибудь хорошим на заголовке

Мне тоже идея нравится! А окошечко можно создавать по примеру товарища sne (где еще создание собственного класса). Главное намутить что-нибудь в Caption'е. Хотя с другой стороны шанс путаницы с другим окошком остается, но он становится намного меньше :)

Ответить

Номер ответа: 30
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #30 Добавлено: 28.02.06 22:45
2 sne: а у меня этот шмоток кода работает на "ура":
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Const ERROR_ALREADY_EXISTS = 183&
Option Explicit

Private Sub Form_Load()
   Call CreateMutex(0, False, "Copyright © Sacred Phoenix, 2006, :)";)
   If Err.LastDllError = ERROR_ALREADY_EXISTS Then Call MsgBox("ERROR_ALREADY_EXISTS", vbCritical, "Error occured";)
End Sub

Ответить

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

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



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