VB6进程路径支持64位进程的路径和32位的进程路径

用普通的API函数只能获取 32位进程的路径,64位进程的路径就无法获取了。得用采用获取dos路径模式。模块代码如下

Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 Private Declare Function GetProcessImageFileNameA Lib "psapi.dll" (ByVal hProcess As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long

Private Declare Function QueryDosDevice Lib "kernel32" Alias "QueryDosDeviceA" (ByVal lpDeviceName As String, ByVal lpTargetPath As String, ByVal ucchMax As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long


'把DOS路径转化为正常的 路径
 Private Function pvReplaceDevice(sPath As String) As String
    Dim sDrive   As String
    Dim sDevice   As String
    Dim lIdx   As Long

    For lIdx = 0 To 25
     sDrive = Chr$(65 + lIdx) & ":"
     sDevice = Space(1000)
     If QueryDosDevice(sDrive, sDevice, Len(sDevice)) <> 0 Then
      sDevice = Left$(sDevice, InStr(sDevice, Chr$(0)) - 1)
'   Debug.Print sDrive; "="; sDevice

      If LCase$(Left$(sPath, Len(sDevice))) = LCase$(sDevice) Then
       pvReplaceDevice = sDrive & Mid$(sPath, Len(sDevice) + 1)
       Exit Function
      End If
     End If
    Next
    pvReplaceDevice = sPath
End Function

'根据进程号获取进程路径函数:
Public Function GetProcessPathByHWND(hwd_ As Long) As String
    On Error GoTo Z
    Dim cbNeeded As Long
    Dim szBuf(1 To 250) As Long
    Dim Ret As Long
    Dim szPathName As String
    Dim nSize As Long
    Dim hProcess As Long
    Dim 进程Pid As Long
    Dim 窗口句柄 As Long
    窗口句柄 = hwd_
       GetWindowThreadProcessId 窗口句柄, 进程Pid
    
    
    hProcess = OpenProcess(&H1F0FFF, 0, 进程Pid)
    
    
    If hProcess <> 0 Then
  
     
        'Ret = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)
        
        Ret = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)
                   szPathName = Space(500)
            nSize = 500
        If Ret <> 0 Then
 
            Ret = GetModuleFileNameExA(hProcess, szBuf(1), szPathName, nSize)
            
            GetProcessPathByHWND = Left(szPathName, Ret)
            'MsgBox szPathName
        Else
               Ret = GetProcessImageFileNameA(hProcess, szPathName, nSize)
            'MsgBox Ret
              GetProcessPathByHWND = pvReplaceDevice(Left(szPathName, Ret)) 'dos路径转化为正常的路径
        End If
    End If
    Ret = CloseHandle(hProcess)
    If GetProcessPathByHWND = "" Then
       GetProcessPathByHWND = ""
    End If
    Exit Function
Z:
End Function

窗体代码如下  参数是 窗口句柄

Private Sub Command1_Click()
    Text1 = GetProcessPathByHWND(Me.hwnd)
End Sub

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值