gzh888666 发表于 2011-2-21 18:10:17

如何获得完整的进程路径(已解决,期待更多更好的方法出来)

本帖最后由 gzh888666 于 2011-2-22 15:48 编辑

_WinAPI_GetModuleFileNameEx
获取进程路径时,很多的进程路径无法获得。
问一下有没有什么办法获得每个进程的路径呢?
最好没有任何遗漏的exe进程!
如smss.exe 、audiodg.exe等等

bsmagic 发表于 2011-2-21 19:17:44

Dim $procName="chrome.exe"
Dim $ProcID=ProcessExists($procName)
;MsgBox(0,'',$ProcID)
If ($ProcID) Then
    MsgBox(0, '', _ProcessGetLocation($ProcID))

EndIf


Func _ProcessGetLocation($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc, 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc, 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn) = 0 Then Return SetError(2, 0, '')
    Return $aReturn
EndFunc参考:http://www.autoitscript.com/forum/topic/41206-how-to-get-file-full-path-of-a-process/page__p__306485#entry306485

bsmagic 发表于 2011-2-21 19:19:06

测试Dim $procName="smss.exe"
同样可以获得路径,但是没有盘符。

gzh888666 发表于 2011-2-21 20:28:27

回复 2# bsmagic


    2楼这个也不全

3mile 发表于 2011-2-21 21:51:33

#Include <WinAPIEx.au3>
#include <array.au3>

$list = ProcessList()
ReDim $list
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 1)

for $i=1 to $list
                $list[$i]=_WinAPI_GetProcessFileName($list[$i])
Next

_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 2)
_WinAPI_CloseHandle($hToken)

_arraydisplay($list)

gzh888666 发表于 2011-2-22 14:15:11

回复 5# 3mile


    相当不错了!谢谢,只有audiodg.exe没有获取到

huxingchun 发表于 2011-3-11 10:33:31

看着那是相当的复杂哦
页: [1]
查看完整版本: 如何获得完整的进程路径(已解决,期待更多更好的方法出来)