Что нового

Пример защиты от повторного запуска скрипта

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Точные параметры флагов в первом примере непомню, но кажется 1 или 0 (как в _Singleton)

Код:
Func _Mutex($handle, $flag = 0)
        Local $ERROR_ALREADY_EXISTS = 183, $dll = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", StringReplace($handle, "\", "")), $err = DllCall("kernel32.dll", "int", "GetLastError")
        If $err[0] = $ERROR_ALREADY_EXISTS and $flag = 0 Then Exit
        SetError($err[0])
        Return $dll[0]
EndFunc


упрощённый вариант первого примера:
Код:
Func _Mutex($semaphore)
    Local $ERROR_ALREADY_EXISTS = 183
    DllCall("kernel32.dll", "int", "CreateSemaphore", "int", 0, "long", 1, "long", 1, "str", $semaphore)
    Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
    If $lastError[0] = $ERROR_ALREADY_EXISTS Then Exit -1
EndFunc


Код:
Func _AlreadyRunning()
    If ProcessExists(@Scriptname) Then
        $list = ProcessList()
            for $i = 1 to $list[0][0]
            If $list[$i][0] = @ScriptName And $list[$i][1] <> @AutoItPID Then 
                Exit
            EndIf
            Next
    EndIf
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Rjevsky
Код:
_SingleTon()
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Можно так, т.к _SingleTon() иногда может не срабатывать.

Код:
If WinExists('MyGUI_#idZdex') Then
	; Скрипт уже запущен
	Exit
EndIf

GUICreate('MyGUI_#idZdex')

...
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
вот из моей программы. Все очень просто:
Код:
#Include <Misc.au3>

AutoItSetOption("TrayAutoPause", 0)

if _Singleton("test",1) = 0 Then 
    TrayTip ("AutoIt", "Арчилинк уже запущен!", 1)
    sleep(2000)
    TrayTip("clears any tray tip","",0)
    Exit
EndIf



Добавлено:
Сообщение автоматически объединено:

Yashied, это если у скрипта GUI есть :smile:
 
Автор
R

Rjevsky

Новичок
Сообщения
102
Репутация
4
Всем спасибо! Принял к сведению!

Ps почемуто не могу никому плюса поставить...
PS Допёр... могу!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Suppir сказал(а):
Yashied, это если у скрипта GUI есть :smile:

GUI всегда можно сделать, необязательно его показывать... Кстати, в AutoIt всегда есть GUI - скрытое окно...
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Еще один способ защиты от повторного запуска...
Даже если окно находится на другом виртуальном рабочем столе ALTDESK, оно будет обнаружено...

Код:
; НАЧАЛО
; Защита от повторного запуска

 $TITLE1="Старт"
 $TEXT1="zZzZzZz"

 ONLYONE()

 ; ...

 $GUI=GuiCreate($TITLE1,400,300)
 GUICtrlCreateLabel($TEXT1,0,0,0,0)

 ; ...

 Func ONLYONE()
  $AW=WinList()
  for $COUNTER=1 to $AW[0][0]
   if ($AW[$COUNTER][0]=$TITLE1) and WinExists($AW[$COUNTER][1],$TEXT1) then Exit
  next
 EndFunc

; КОНЕЦ
 

bulldog5293

Знающий
Сообщения
172
Репутация
10
А как быть если скрипт работает фоново и нада запретить ему 2-й запуск в один день. То есть, что бы программу можно было запустить один раз в день. Я решил что она должна вести лог даты и по совпадению с текущей не запускаться, но как зделать не пойму.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
bulldog5293
то есть если программа запущена уже не первый день, то повторно ее запустить все же можно будет?
 

bulldog5293

Знающий
Сообщения
172
Репутация
10
Тоесть если она была запущена вчера то сегодня можно запустить, если сегодня уже запускалась то нельзя, ориентировалась бы на лог файл даты, который самы бы вела
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
bulldog5293
задам вопрос по другому. программа будет работать непрерывно/какое-то время или же запуститься, сделает определенные операции и выключится?
если второе, то не обязательно вести именно лог-файл. можно просто ини файл с записью типа -
Код:
[Launch]
LastLaunch=01/01/2010
а программа будет каждый раз читать оттуда дату через IniRead, и если дата совпадает с сегодняшней, то выключится... сравнение надо будет делать через DateDiff
 

bulldog5293

Знающий
Сообщения
172
Репутация
10
Спасиба за быстрый и продуктивный ответ, ставлю тебе +1 :IL_AutoIt_1:
 
Верх