Что нового

[Процессы] Запрет на повторное выполнение .exe

pekich

Новичок
Сообщения
19
Репутация
2
Версия AutoIt: 3.3.6.1

Нужен скрипт.
Есть два файла EXE скомпилированных аутоитом , с одинаковыми именами - Word.exe и Word.exe.
Условимся называть их №1 и №2.
Некий процесс запускает файл №1-который еще не закончил работу, следом запускается файл №2.
Так вот что нужно :
когда выполняется файл №1и возникает процесс №2, то надо убить процесс №2.
Или по другому: скрипты с интервалом доли секунд оказываются запущенными по очереди - первым №1, вторым №2. Надо убить №2, чтобы не дать ему выполниться.

Сделайте или подскажите в каком направлении двигаться.
Пробовал эксперементировать с ProcessExists , ProcessClose, If ... Then -безуспешно.

PS: Щас помучаюсь как вставить правильно...
 

kaster

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


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

тут

{CodeWarn.SModer}


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

Код:
$PID_1 = Run("Word.exe")
$PID_2 = Run("Word.exe")
If ProcessExists($PID_1) Then ProcessClose($PID_2)
 
Автор
P

pekich

Новичок
Сообщения
19
Репутация
2
[Процессы] Re: [Процессы] Запрет на повторное выполнение .exe

1.
Пробую раскрасить код программой Au3ToPost.
Вставляю в страницу - код HTML есть, раскраски нет.
Что не так делаю?
2. Предложенный Вами код не подходит.
Run нужен только для имитации запуска программы.
Объясню по другому, так точнее будет.
Есть один файл Word.exe .
Если запустить Word.exe(№1) и сразу же следом запустить этот же Word.exe(№2), то в Word.exe(№1) должно быть прописано - или уничтожить процесс Word.exe(№2) , или запретить повторный запуск Word.exe(№1)
Название программы, которая будет запускать Word.exe - известно, например : Start.exe
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
pekich [?]
Пробую раскрасить код программой Au3ToPost.
не надо. в предупреждении ясно написано, на что нажимать, чтобы раскрасить код
Что не так делаю?
не читаешь, то что пишут
Предложенный Вами код не подходит.
смотря для чего. то что я предложил это даже не код, а просто подсказка, что PID процесса хранится в возвращаемом значении от Run. даже для одноименных процессов этот PID будет разный
Есть один файл Word.exe .Если запустить Word.exe(№1) и сразу же следом запустить этот же Word.exe(№2), то в Word.exe(№1) должно быть прописано - или уничтожить процесс Word.exe(№2) , или запретить повторный запуск Word.exe(№1)Название программы, которая будет запускать Word.exe - известно, например : Start.exe
какая-то каша из терминологии. разберись с PID запускаемых процессов, чтобы в дальнейшем управлять – уничтожить процесс или оставить.
и раз уж есть код и ТЗ размазано максимально возможно, переношу тему в раздел для новичков
 
Автор
P

pekich

Новичок
Сообщения
19
Репутация
2
От меня нужно более ясное ТЗ, чтобы продолжить обсуждение ?
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Вставь в скрипт №1 проверку

Код:
$list = ProcessList(@ScriptName)
If $list[0][0] > 1 Then
	For $i = 1 To $list[0][0]
		If $list[$i][1] <> @AutoItPID Then
			ProcessClose($list[$i][1]
			;Или Run('taskkill /pid '&$list[$i][1]&' /f /t')
		EndIf
	Next
EndIf


Или если трудно вставить проверку, то просто добавь в скрипт №1:
Код:
;В начало скрипта
AdlibRegister('killAnother')


;В любое место
Func killAnother()
	$list = ProcessList(@ScriptName)
	If $list[0][0] = 1 Then Return
	For $i = 1 To $list[0][0]
		If $list[$i][1] <> @AutoItPID Then
			ProcessClose($list[$i][1]
			;Или Run('taskkill /pid '&$list[$i][1]&' /f /t')
		EndIf
	Next

EndFunc   ;==>killAnother
 
Автор
P

pekich

Новичок
Сообщения
19
Репутация
2
1. Спасибо BIOS, похоже на то что мне надо. Обязательно буду пробовать.
Завтра отпишусь.

2. Интересует еще один вариант исполнения с помощью _Singleton :
Запретить запуск второй копии приложения или, по другому, предотвратить повторный запуск приложения.
Пока приложение работает, его повторный запуск невозможен.
Попробовл, но копии запускаются. Где ошибка ?
Название скомпилированного скрипта Word.au3 - Word.exe
Код:
#include "Misc.au3"
if _Singleton("Word.exe",1) = 0 Then
     ProcessClose ("Word.exe")
    Exit
EndIf
Sleep(60000); во время паузы запускаю копии Word.exe
Exit(0);
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
pekich
Код:
; http://www.autoitscript.com/forum/topic/79460-usbmon/page__view__findpost__p__572867
;============# Запрет на повторный запуск #====================================
$hMutex = DllCall("kernel32.dll", "hwnd", "OpenMutex", "int", 0x1F0001, "int", False, "str", "MyProgram")

If $hMutex[0] Then
	$hWnd = WinGetHandle("MyProgram")
	WinSetState($hWnd, "", @SW_RESTORE)
	DllCall("user32.dll", "int", "SetForegroundWindow", "hwnd", $hWnd)
	Exit
EndIf

$hMutex = DllCall("kernel32.dll", "hwnd", "CreateMutex", "int", 0, "int", False, "str", "MyProgram")
;============================================================================
 
Автор
P

pekich

Новичок
Сообщения
19
Репутация
2
Всем добрый день.
Спасибо BIOS и AZJIO за подсказки.
Подведу итоги.

Код который дал BIOS:
Уничтожает любое количество УЖЕ запущенных процессов с одинаковыми именами , но разными PIDами. Процессы возникающие после запуска не
удаляет. Код будет хорош, если работает в приложении , код которого постоянно опрашивается, или в скрипте если надо удалить уже работающий процесс. Мне не подошел.
Код который дал AZJIO:
Блокировка запуска копий приложения по хэндлу его рабочего окна. Нет у меня окон.
Код который привел я :
Вот он мне и подошел,с небольшой поправкой. Не разобрался, поспешил спросить.
Надежно блокирует множественные запуски "самого себя", до окончания работы скрипта.
Код:
#include <Misc.au3>; 
if _Singleton(@ScriptName,1) = 0 Then; 
Exit; 
EndIf; 
;Здесь код программы, которую должен выполнить скрипт.
Sleep(60000); искусственная задержка, пока скрипт висит в трее, запуск его копий невозможен.
Exit(0);
 

ArtInt

Знающий
Сообщения
135
Репутация
18
pekich, мне кажется, что твой скрипт завершит ОБЕ копии процесса. Разве нет? ;D
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Или оба кода можно изменять то в начале каждого можно вписать это
Код:
TCPStartup()
$szIPADDRESS=@IPAddress1
$MainSocket = TCPListen($szIPADDRESS,2001)
if $MainSocket=-1 Then	Exit

При запуске скрипт заберает под себя порт, если порт занет то завершается.


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

Главное правельно выбрать порт , чтобы как только можно снизить верятность нарваться на порт который юзает другая программа, в этом случаи не запуститься не один скрипт :whistle:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
pekich
Код который дал AZJIO:
Блокировка запуска копий приложения по хэндлу его рабочего окна. Нет у меня окон.
Разве это критерий? Не будь даже тела скрипта, вставь просто бесконечный цикл и вторая копия уже не запустится.
Код:
While 1
	Sleep(10000)
WEnd

Вот только название окна "MyProgram" указанное 3 раза можно вынести в переменную и указывать уникальное имя по полному названию программы с цифровым индексом, чтобы исключить простого совпадения.

на счёт _Singleton - функция для этого случая создана, осталось справку прочитать, там по русски написано:
0 - Выход скрипта с кодом выхода -1, если другой экземпляр уже существует.
1 - Не завершает повторно запущенный скрипт.
Так что нужно в параметре ставить 0, а не 1.
 
Автор
P

pekich

Новичок
Сообщения
19
Репутация
2
для ArtInt
pekich, мне кажется, что твой скрипт завершит ОБЕ копии процесса. Разве нет?

Что бы не казалось сделай так, например :
cкомпилируй в " Любое имя .exe" . Запускаешь и он висит в трее 60 сек. Пока висит пытаешься запустить копии " Любое имя .exe".

для AZJIO
на счёт _Singleton - функция для этого случая создана, осталось справку прочитать, там по русски написано:
0 - Выход скрипта с кодом выхода -1, если другой экземпляр уже существует.
1 - Не завершает повторно запущенный скрипт.
Так что нужно в параметре ставить 0, а не 1.

AZJIO, конечно не критерий . Для моей цели меня устроила простая конструкция _Singleton. Если задача выполняется как надо, то зачем усложнять ? Твой пример положил себе в Полезняшки. Понадобится - а он уже есть , не тратить время на поиски.

На счёт _Singleton такое дело, поясни.
1. У меня в справке эта функция на английском. Переведешь ,а по смыслу - абракадабра.
Пожалуйста дай ссылку на твою справку.
2. В параметре ставил и 0,и 1- разницы не увидел. Как увидеть разницу ?
Код:
if _Singleton(@ScriptName,0 или1) = 0


PS: как цитаты вставлять ?Не могу найти
 

ArtInt

Знающий
Сообщения
135
Репутация
18
для ArtInt
pekich, мне кажется, что твой скрипт завершит ОБЕ копии процесса. Разве нет?

Что бы не казалось сделай так, например :
cкомпилируй в " Любое имя .exe" . Запускаешь и он висит в трее 60 сек. Пока висит пытаешься запустить копии " Любое имя .exe".

Я понимаю, что на форуме не дураки сидят, и что скрипт, должно быть, работает, но меня интересует почему не вылетают оба? Ведь обе программки увидят своего собрата, и вылетят... Нет? Просто я вообще не знаком с этой функцией, объясните, плз. Кстати, это не только к вашему скрипту относится, так все работают :-[

Процессы возникающие после запуска не
удаляет.
С Adlibegister'ом юзал? :blink: Если написать просто

Код:
$list = ProcessList(@ScriptName)
If $list[0][0] > 1 Then
    For $i = 1 To $list[0][0]
        If $list[$i][1] <> @AutoItPID Then
            ProcessClose($list[$i][1]
            ;Или Run('taskkill /pid '&$list[$i][1]&' /f /t')
        EndIf
    Next
EndIf
то такое закономерно, иначе, я опять не до понял...
 
Верх