Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

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

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

Ответить

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

Номер ответа: 46
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #46
Добавлено: 03.03.06 17:19
Гы... А можно ваЩе по-тупому сделать... Когда первая копия проги ранится, чё-то там пишет в реестр (или создаёт файлик). Когда выгружается - удаляет. А когда вторая копия грузится - проверяет - ага - есть ветка (файлик) - выгружаемся нафиг, показываем мессаг (опционально)
:)


Было похожее реализовано в одной небольшой игрушке... За это я готов был
убить аффтара :) При определенных глюках игры из нее нельзя было выйти
"нормально" и приходилось убивать процесс через TaskManager, после
чего соответственно запустить игру повторно было невозможно.

Так что это не вариант.

А так, насколько я знаю, самый популярный вариант решения задачи - это
именно мьютексы.

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #47 Добавлено: 03.03.06 17:29

Так что это не вариант.

Ну почему же. Прописываешься куда-нить в RunOnce - и после перезагрузки усё пучком :))

Ответить

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



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #48 Добавлено: 03.03.06 17:53
Ну зачем так категорично? Ты видишь тут толпу протестующих? Просто люди ищут разные решения
Толпы нет, просто если мьютексы - хороший легкий способ, зачем еще что-то? :)
капец, ответ №1 был самый лучший...
Конечно, если не читать последующие :)
Ага, особенно #2

Ответить

Номер ответа: 49
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #49
Добавлено: 03.03.06 20:42
da poh na raznie imena

Ответить

Номер ответа: 50
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #50 Добавлено: 03.03.06 22:48
Гы. №32 тоже полезный :)

Ответить

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



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #51 Добавлено: 04.03.06 20:25
Гы. №32 тоже полезный :)

Не, а че, у меня mutex'ы пашут отлично, даже если прогу вырубить через Task Manager :)

Ответить

Номер ответа: 52
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #52 Добавлено: 07.03.06 19:15
Не заморачивайтесь! Проще веточка в реестре. Только может поглючить при жесткой выгрузке, но это уж юзер виноват. Хотя такая ситуация тоже исправляется-надо в реестр писать Hwnd, а потом проверять-есть таое окно или нет.

Ответить

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



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #53
Добавлено: 07.03.06 20:42
Да он [юзер] вообще сам виноват, что решил использовать эту программу.
Только может поглючить при жесткой выгрузке, но это уж юзер виноват.
Ответ #46 читал?
HWnd писать - неплохо в принципе, но вдруг этот hWnd изменится по тем или иным причинам. Или накладочка выйдет... Короче, хватит уже способов. Куда уж проще мьютексов?

Ответить

Номер ответа: 54
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #54 Добавлено: 07.03.06 20:53
HWnd писать - неплохо в принципе, но вдруг этот hWnd изменится по тем или иным причинам. Или накладочка выйдет...

Дык не только HWND писать, а ещё чё-то...

Но, на счёт mutexОВ, соглашусь, тоже неплохой вариант. И ваще, необязательно, чтобы был только один способ (хороший). Их минимум при решении практически любой задачи - 2

Ответить

Номер ответа: 55
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #55
Добавлено: 09.03.06 09:12
Вот чего нарыл:

Private Sub Command1_Click()
 If (semHNDL <> 0) Then RC& = ReleaseSemaphore(semHNDL, 1, CC&;)
 End
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
 If (semHNDL <> 0) Then RC& = ReleaseSemaphore(semHNDL, 1, CC&;)
 Cancel = 0
End Sub

 Добавляем к проекту модуль. В область кода заносим:
Public Declare Function CreateSemaphore Lib "kernel32" _
  Alias "CreateSemaphoreA" _
  ;(ByVal lpSemaphoreAttributes As Long, _
       ByVal lInitialCount As Long, _
       ByVal lMaximumCount As Long, _
       ByVal lpName As String) As Long

Public Declare Function ReleaseSemaphore Lib "kernel32" _
       ;(ByVal hSemaphore As Long, _
       ByVal lReleaseCount As Long, _
       lpPreviousCount As Long) As Long

Global semHNDL As Long

Sub Main()
 Err.Clear
 semHNDL = CreateSemaphore(0, 0, 1, "Cats_Tail";)
 RC& = Err.LastDllError
 If (RC& <> 0) Or (semHNDL = 0) Then
       '::: Это - не первый экземпляр
       MsgBox "Повторный запуск!"
     End
    End If
 Form1.Show
End Sub


Устанавливаем startup-объект - "SUB MAIN".

Ответить

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



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #56 Добавлено: 09.03.06 12:09
Да уж, верно говорят - люди ищут самые нерациональные решения. Или тут соревнование - кто напишет больше строк кода для простой задачи?

HWnd писать - неплохо в принципе

С реестром можно на правах погореть. Да и вариант совпадения hWnd не исключается.
Самый руль - все же PrevInstance. Переименовывать прогу нефиг, это только пиратам понадобиться может. Еще лучше - поставить проверку на App.EXEName. Если не совпадает - пишем что-нить вроде "Иди нахрен, грязный пират" и выгружаемси :)

Ответить

Номер ответа: 57
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #57 Добавлено: 10.03.06 00:32
Еще лучше - поставить проверку на App.EXEName.

Хм, а действительно. Этот вариант, пожалуй, самый эффектив.

Ответить

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

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



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