Что нового

Правильно ли завершаю процесс(TerminateProcess)?

S

sh01u

Гость
Допустим есть несколько процессов с одним именем, правильно ли использовать функцию TerminateProcess с условием что процессы были открыты через CreateProcess?

Код:
Func ProcessCloseW($s_pname)
Local Const $TH32CS_SNAPPROCESS = 0x00000002
Local $tagPROCESSENTRY32 = DllStructCreate("dword dwsize;dword cntUsage;dword th32ProcessID;uint th32DefaultHeapID;dword th32ModuleID;dword cntThreads;dword th32ParentProcessID;long pcPriClassBase;dword dwFlags;char szExeFile[260]")
Local $a_toolh = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)
DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))
Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_toolh[0], "ptr", $p_PROCESSENTRY32)
While 1
   $a_pnext = DLLCall("Kernel32.dll", "int", "Process32Next", "long", $a_toolh[0], "ptr", $p_PROCESSENTRY32)
   If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop
   $i_close_pid = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
   If $i_close_pid = $s_pname Then
	  $a_popen = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", BitOR(0x0400,0x0004,0x0001), "int", 0, "dword", DllStructGetData($tagPROCESSENTRY32, "th32ProcessID"))
	  $a_exitcode = DllCall("kernel32.dll", "int", "GetExitCodeProcess", "hwnd", $a_popen[0], "int_ptr", DllStructGetPtr($pStruct))
	  DllCall("kernel32.dll", "bool", "TerminateProcess", "hwnd", $a_exitcode[1], "uint", $a_exitcode[2])
   EndIf
WEnd
EndFunc

ProcessCloseW("notepad.exe")
 
Верх