|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как узнать запущены ли два процесса с одним именем |
|
[решено] Как узнать запущены ли два процесса с одним именем
|
Новый участник Сообщения: 44 |
Профиль | Отправить PM | Цитировать Необходимо знать запущены ли два процесса с одним именем или нет. Процессы из одного приложения. У кого какие мысли на этот счет?
|
|
Отправлено: 13:12, 15-10-2009 |
Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 13:37, 15-10-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 44
|
Профиль | Отправить PM | Цитировать kaster, Нет, ты меня немного недопонял. Есть приложение создающие из себя два процесса. Необходимо реализовать следующую проверку: если запущен один процесс или ни одного, то гууд. Если два то выход.
По сути я это уже реализовал, но только деревянным методом: $list = ProcessList("приложение.exe") for $i = 1 to $list[0][0] FileWriteLine("test.txt", $list[$i][1]) next Sleep(50) $datacheckline = _FileCountLines("test.txt") if $datacheckline >= 2 Then exit Elseif $datacheckline = 1 Or NOT FileExists("test.txt") Then Run(1234.exe) и дальше код... Он слишком прост, и тем более создается левый файл. Нужно как-то попрофессиональней чтоли |
Отправлено: 13:50, 15-10-2009 | #3 |
Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать Да нет, я все правильно понял
Но твой способ действительно "деревянный" И потом, обрамляй код тэгами Необязательно создавать файл, писать туда данные а потом снова считывать. Достаточно просто проверить кол-во элементов $list[0][0] Если больше двух, выход. |
------- Отправлено: 13:56, 15-10-2009 | #4 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Если нужно узнать является ли второй процесс дочерним первому, то сделать это можно так:
$aChilds_IDs = _ProcessGetChildren("приложение.exe") If Not @error And $aChilds_IDs[0][0] >= 1 Then Exit 2 Else Run("1234.exe") EndIf ;=================================================================================================== ; Function Name: _ProcessGetChildren() ; ; Description: Retrieve an array of all top level child processes ; ; Parameter(s): $i_pid: The process identifier of the process you want to list the child ; processes from ; ; Return Value(s): ; On Success: ; 2 dimensional array: ; [0][0] number of child processes found ; [n][0] is the process id of the child ; [n][1] is the process name of the child ; ; On Failure: ; Non array ; ; @Error: ; (1): CreateToolhelp32Snapshot failed ; (2): Process32First failed ; (3): No children processes found ; ; Remark(s): Tested on Windows XP SP2 ; ; Author(s): SmOke_N (Ron Nielsen) ; ;=================================================================================================== Func _ProcessGetChildren($i_Pid) ; First level children processes only If IsString($i_Pid) Then $i_Pid = ProcessExists($i_Pid) If Not $i_Pid Then Return SetError(-1, 0, $i_Pid) Local Const $TH32CS_SNAPPROCESS = 0x00000002 Local $a_tool_help = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0) If IsArray($a_tool_help) = 0 Or $a_tool_help[0] = -1 Then Return SetError(1, 0, $i_Pid) Local $tagPROCESSENTRY32 = _ DllStructCreate( _ "dword dwsize;" & _ "dword cntUsage;" & _ "dword th32ProcessID;" & _ "uint th32DefaultHeapID;" & _ "dword th32ModuleID;" & _ "dword cntThreads;" & _ "dword th32ParentProcessID;" & _ "long pcPriClassBase;" & _ "dword dwFlags;" & _ "char szExeFile[260]") DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32)) Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32) Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32) If IsArray($a_pfirst) = 0 Then Return SetError(2, 0, $i_Pid) Local $a_pnext, $a_children[11][2] = [[10]], $i_child_pid, $i_parent_pid, $i_add = 0 $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID") If $i_child_pid <> $i_Pid Then $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID") If $i_parent_pid = $i_Pid Then $i_add += 1 $a_children[$i_add][0] = $i_child_pid $a_children[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile") EndIf EndIf While 1 $a_pnext = DllCall("Kernel32.dll", "int", "Process32Next", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32) If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID") If $i_child_pid <> $i_Pid Then $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID") If $i_parent_pid = $i_Pid Then If $i_add = $a_children[0][0] Then ReDim $a_children[$a_children[0][0] + 11][2] $a_children[0][0] = $a_children[0][0] + 10 EndIf $i_add += 1 $a_children[$i_add][0] = $i_child_pid $a_children[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile") EndIf EndIf WEnd If $i_add <> 0 Then ReDim $a_children[$i_add + 1][2] $a_children[0][0] = $i_add EndIf DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0]) If $i_add Then Return $a_children Return SetError(3, 0, 0) EndFunc ;==>_ProcessGetChildren |
|
------- Отправлено: 14:50, 15-10-2009 | #5 |
Новый участник Сообщения: 44
|
Профиль | Отправить PM | Цитировать kaster, Спасибо подошло
Creat0R, хотя узнавать является ли процесс дочерним было не нужно, но все равно большое спасибо. Думаю в будущем это пригодиться |
Отправлено: 06:31, 16-10-2009 | #6 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать CyberStyLe, если тема решена, то её следует помечать как таковую: Как сообщить о том, что моя проблема решена?
|
------- Отправлено: 17:46, 16-10-2009 | #7 |
Новый участник Сообщения: 44
|
Профиль | Отправить PM | Цитировать Creat0R, Упс.. забыл сразу сделать. Отметил как [решено]
|
Отправлено: 10:14, 18-10-2009 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как одним кликом открыть два всплывающих окна | QUMATOZ | Вебмастеру | 15 | 11-05-2010 19:16 | |
CMD/BAT - [решено] Удаление всех папок с одним именем на всех дисках | volk1234 | Скриптовые языки администрирования Windows | 15 | 13-11-2009 02:13 | |
VBA - Как узнать имя процесса-родителя | akkorn | Программирование и базы данных | 4 | 16-03-2009 11:33 | |
Как узнать имя процесса по смещению | Andre505 | Microsoft Windows 95/98/Me (архив) | 3 | 28-09-2003 00:29 | |
Как узнать имя процесса по смещению | Andre505 | Программирование и базы данных | 2 | 27-09-2003 13:55 |
|