Что нового

Как определить запущен скрипт или нет

VadimKHL

Новичок
Сообщения
155
Репутация
0
Добрый день!

Вопрос, как можно определить, запущен ли скрипт или нет.
Раньше делал так:
If WinExists($GUI) = 1 Then
Return
EndIf

Но теперь скрипт не имеет окна GUI, запускается в трее, каким образом можно отследить и запретить повторный запуск, если приложение еще запущенно?
Т.е. запретить запуск клонов.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Это вариант не проходит,
если запустить допустим запустить TEST.EXE,
потом его переименовать и снова запустить.

Как быть?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
на форуме это уже обсуждалось
лично я пользуюсь таким способом
Код:
#include <WinAPIFiles.au3>
_CheckClon()
$Form1 = GUICreate("Form1", 412, 142, 192, 124)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit

	EndSwitch
WEnd

Func _CheckClon()
	Local $CF, $VF, $stData
	$CF = _WinAPI_OpenFileMapping('MyProc')
	If $CF Then
		$VF = _WinAPI_MapViewOfFile($CF)
		$stData = DllStructCreate('wchar [512]', $VF)
		MsgBox(64, '', 'Программа уже работает' & @CRLF & 'Pid: ' & DllStructGetData($stData, 1))
		Exit
	Else
		$CF = _WinAPI_CreateFileMapping(-1, 1024, 'MyProc')
		$VF = _WinAPI_MapViewOfFile($CF)
		$stData = DllStructCreate('wchar [512]', $VF)
		DllStructSetData($stData, 1, @AutoItPID)
	EndIf
EndFunc   ;==>_CheckClon
сделай дубль кода, запусти один, потом второй

функцию можно упростить, просто создать виртуальный файл
при запуске проверять его существование, если он есть, то выход
Код:
Func _CheckClon()
	Local $CF, $VF
	$CF = _WinAPI_OpenFileMapping('MyProc')
	If $CF Then
		Exit
	Else
		$CF = _WinAPI_CreateFileMapping(-1, 1024, 'MyProc')
	EndIf
EndFunc   ;==>_CheckClon
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Joiner, а в чем отличие примеров, можно прокометировать?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Виртуальный файл используется для передачи данных. Это его главное назначение.
В первом случае я передал pid процесса. Во втором случае проверяется только наличие виртуального файла посредством подключения к нему.
Имя виртуального файла произвольное. Измени по своему усмотрению. Лучше сгенерировать длинное имя с чередованием букв и цифр.
Я нашел этот способ надежным для предотвращения повторного запуска программы.
 
Автор
V

VadimKHL

Новичок
Сообщения
155
Репутация
0
Хорошее решение!
Все работает.
Спасибо за помощь!
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
VadimKHL

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх