Func _MY_ProcessListEx($sResourceName="", $sInResString="", $iWholeWord=1, $iTypeSearch = 1)
#comments-start
Перегружаемая функция!
2 режима работы.
Если $iTypeSearch = 1, то, независимо от $sResourceName возвращает
массив с процессом, путь к которому вместе с именем файла указан в $sInResString
[0][0] - количество процессов
[n][0] - имя образа
[n][1] - PID
[n][2] - полный путь к образу
Если $iTypeSearch = 0, то $sResourceName - имя поля файла процесса (Имя поля обычно может быть одним из:
Comments, InternalName, ProductName, CompanyName, LegalCopyright, ProductVersion,
FileDescription, LegalTrademarks, PrivateBuild, FileVersion, OriginalFilename, SpecialBuild)
$sInResString - значение поля, по которому ищем процессы
На выходе тот же массив
$iWholeWord = 1 полное соответствие при поиске
$iWholeWord = 0 частичное соответствие
#comments-end
Local $aProcList = ProcessList()
Local $hKernel32_Dll = DllOpen('Kernel32.dll'), $hPsapi_Dll = DllOpen('Psapi.dll')
Local $aOpenProc, $aProcPath, $sFileVersion, $aRet_List[1][1]
If $hKernel32_Dll = -1 Then Return SetError(1, 0, '')
If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@SystemDir & '\Psapi.dll')
If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@WindowsDir & '\Psapi.dll')
If $hPsapi_Dll = -1 Then Return SetError(2, 0, '')
Local $vStruct = DllStructCreate('int[1024]')
Local $pStructPtr = DllStructGetPtr($vStruct)
Local $iStructSize = DllStructGetSize($vStruct)
For $i = 1 To UBound($aProcList)-1
$aOpenProc = DllCall($hKernel32_Dll, 'hwnd', 'OpenProcess', _
'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])
If Not IsArray($aOpenProc) Or Not $aOpenProc[0] Then ContinueLoop
DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', _
'hwnd', $aOpenProc[0], _
'ptr', $pStructPtr, _
'int', $iStructSize, _
'int*', 0)
$aProcPath = DllCall($hPsapi_Dll, 'int', 'GetModuleFileNameEx', _
'hwnd', $aOpenProc[0], _
'int', DllStructGetData($vStruct, 1), _
'str', '', _
'int', 2048)
DllCall($hKernel32_Dll, 'int', 'CloseHandle', 'int', $aOpenProc[0])
If Not IsArray($aProcPath) Or StringLen($aProcPath[3]) = 0 Then ContinueLoop
;_ArrayDisplay($aProcPath,"")
If $iTypeSearch = 0 then $sFileVersion = FileGetVersion($aProcPath[3], $sResourceName)
If $iTypeSearch = 1 then $sFileVersion = $aProcPath[3]
If $iTypeSearch = 0 Then
If $sResourceName = "" Or $sFileVersion = $sInResString Or _
($iWholeWord = 0 And StringInStr($sFileVersion, $sInResString)) Then
$aRet_List[0][0] += 1
ReDim $aRet_List[$aRet_List[0][0]+1][3]
$aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name
$aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID)
$aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path
EndIf
Else
If $sFileVersion = $sInResString Or _
($iWholeWord = 0 And StringInStr($sFileVersion, $sInResString)) Then
$aRet_List[0][0] += 1
ReDim $aRet_List[$aRet_List[0][0]+1][3]
$aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name
$aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID)
$aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path
EndIf
EndIf
Next
DllClose($hKernel32_Dll)
DllClose($hPsapi_Dll)
If $aRet_List[0][0] < 1 Then Return SetError(3, 0, '')
Return $aRet_List
EndFunc