Skif_off:
Подскажите, пожалуйста, что не так с объектом Scripting.Dictionary: для экономии пробую объединить функции _WinAPI_GetParentProcess() и _WinAPI_GetProcessName() (AutoIt 3.3.8.1, WinAPIEx v.3.8_3380), чтобы не перебирать дважды список процессов, [more=один из вариантов функции]
Код:
[/more] выдаёт ошибку
Цитата:
Что не так с $oDict.Add? Подумал было, что первый процесс System с PID = 0 и такой ключ "не устраивает" объект, добавил условие
Код:
но всё равно ошибка. Проверял на Win7x32.
jFobos
Всё равно не очень понял :) Ну да ладно, всё равно функции WM_* беру готовые или подсказанные и проблем пока не было, а будут - начнёт доходить...
Подскажите, пожалуйста, что не так с объектом Scripting.Dictionary: для экономии пробую объединить функции _WinAPI_GetParentProcess() и _WinAPI_GetProcessName() (AutoIt 3.3.8.1, WinAPIEx v.3.8_3380), чтобы не перебирать дважды список процессов, [more=один из вариантов функции]
Код:
Func _WinAPI_GetParentProcessPIDAndName($PID = 0) If Not $PID Then $PID = @AutoItPID EndIf Local $oDict = ObjCreate('Scripting.Dictionary') Local $hSnapshot = DllCall('kernel32.dll', 'ptr', 'CreateToolhelp32Snapshot', 'dword', 0x00000002, 'dword', 0) If (@error) Or (Not $hSnapshot[0]) Then Return SetError(1, 0, 0) EndIf Local $tPROCESSENTRY32 = DllStructCreate('dword Size;dword Usage;dword ProcessID;ulong_ptr DefaultHeapID;dword ModuleID;dword Threads;dword ParentProcessID;long PriClassBase;dword Flags;wchar ExeFile[260]') Local $pPROCESSENTRY32 = DllStructGetPtr($tPROCESSENTRY32) Local $Ret, $aResult[2], $iTmp $hSnapshot = $hSnapshot[0] DllStructSetData($tPROCESSENTRY32, 'Size', DllStructGetSize($tPROCESSENTRY32)) $Ret = DllCall('kernel32.dll', 'int', 'Process32FirstW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32) While (Not @error) And ($Ret[0]) $iTmp = DllStructGetData($tPROCESSENTRY32, 'ProcessID') If $iTmp = $PID Then $aResult[0] = DllStructGetData($tPROCESSENTRY32, 'ParentProcessID') EndIf If $iTmp <> 0 Then $oDict.Add($iTmp, DllStructGetData($tPROCESSENTRY32, 'ExeFile')) $Ret = DllCall('kernel32.dll', 'int', 'Process32NextW', 'ptr', $hSnapshot, 'ptr', $pPROCESSENTRY32) WEnd _WinAPI_CloseHandle($hSnapshot) $aResult[1] = $oDict.Item($aResult[0]) Return $aResult EndFunc ;==>_WinAPI_GetParentProcessPIDAndName |
Цитата:
Error: The requested action with this object has failed |
Что не так с $oDict.Add? Подумал было, что первый процесс System с PID = 0 и такой ключ "не устраивает" объект, добавил условие
Код:
If $iTmp <> 0 Then |
но всё равно ошибка. Проверял на Win7x32.
jFobos
Всё равно не очень понял :) Ну да ладно, всё равно функции WM_* беру готовые или подсказанные и проблем пока не было, а будут - начнёт доходить...