mikezunya 发表于 2013-10-31 15:09:32

回复 2# afan


afan版主,你好,这边为什么打开提示错误: _WinAPI_GetModuleFileNameEx(): 未定义的函数.,头文件我看了下,是一样的。多版本差距很大么?

afan 发表于 2013-10-31 15:36:11

本帖最后由 afan 于 2013-10-31 15:37 编辑

回复 16# mikezunya


    WinAPIEx.au3 这个头文件会由于升级而 增、删、改、重命名某(些)函数,所以会有此情况。
可以提取使用。
$PID = ProcessExists("explorer.exe")
MsgBox(0, "", _WinAPI_GetModuleFileNameEx($PID))


Func _WinAPI_CloseHandle($hObject)
        Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
        If @error Then Return SetError(@error, @extended, False)
        Return $aResult
EndFunc   ;==>_WinAPI_CloseHandle
Func _WinAPI_GetCurrentProcessID()
        Local $aResult = DllCall("kernel32.dll", "dword", "GetCurrentProcessId")
        If @error Then Return SetError(@error, @extended, 0)
        Return $aResult
EndFunc   ;==>_WinAPI_GetCurrentProcessID
Func _WinAPI_GetModuleFileNameEx($PID = 0)
        If Not $PID Then
                $PID = _WinAPI_GetCurrentProcessID()
                If Not $PID Then
                        Return SetError(1, 0, 0)
                EndIf
        EndIf
        Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', 0x00000410, 'int', 0, 'dword', $PID)
        If (@error) Or (Not $hProcess) Then
                Return SetError(1, 0, '')
        EndIf
        Local $tPath = DllStructCreate('wchar')
        Local $Ret = DllCall('psapi.dll', 'int', 'GetModuleFileNameExW', 'ptr', $hProcess, 'ptr', 0, 'ptr', DllStructGetPtr($tPath), 'int', 1024)
        If (@error) Or (Not $Ret) Then
                $Ret = 0
        EndIf
        _WinAPI_CloseHandle($hProcess)
        If Not IsArray($Ret) Then
                Return SetError(1, 0, '')
        EndIf
        Return DllStructGetData($tPath, 1)
EndFunc   ;==>_WinAPI_GetModuleFileNameEx

mikezunya 发表于 2015-8-4 10:55:01

回复 15# 时空之门


    谢谢,是头文件不一样

mikezunya 发表于 2017-9-16 15:23:03

回复 9# xms77


    你是在哪里查阅到PROCESS_ALL_ACCESS等于0x001F0FFF的?
页: 1 [2]
查看完整版本: 如何通过进程名或者PID获取进程路径[已解决]