通过ProcessID获取过程路径和名称-结果不一致(VB6,VBA)
|
我正在使用下面的代码来获取给定进程的文件路径和名称。我只是将ProcessID传递给函数ExePathFromProcID,它应该返回完整路径。它列举了硬盘驱动器作为设备而不是使用驱动器号,但这不是我的抱怨。查看我的代码,然后在下面查看我的投诉。
Public Declare Function OpenProcess Lib \"kernel32\" ( _
ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Public Declare Function GetProcessImageFileName Lib \"psapi.dll\" Alias \"GetProcessImageFileNameA\" _
(ByVal hProcess As Long, _
ByVal lpImageFileName As String, _
ByVal nSize As Long) As Long
Public Declare Function CloseHandle Lib \"kernel32\" ( _
ByVal hObject As Long) As Long
Private Function ExePathFromProcID(idProc As Long) As String
Const MAX_PATH = 260
Const PROCESS_QUERY_INFORMATION = &H400
Const PROCESS_VM_READ = &H10
Dim sBuf As String
Dim sChar As Long, l As Long, hProcess As Long
sBuf = String$(MAX_PATH, Chr$(0))
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, idProc)
If hProcess Then
sChar = GetProcessImageFileName(hProcess, sBuf, MAX_PATH)
If sChar Then
sBuf = Left$(sBuf, sChar)
ExePathFromProcID = sBuf
Debug.Print sBuf
End If
CloseHandle hProcess
End If
End Function
我的抱怨是,只要首先检索较长的路径,则返回较短的路径时仍会显示较长的过程路径的一部分。这是一个例子:
首次致电(正确结果):
\\ Device \\ HarddiskVolume2 \\ Program Files \\ Portable Apps \\ Notepad ++ Portable \\ App \\ Notepad ++ \\ notepad ++。exe
二次致电(意外结果):
\\ Device \\ HarddiskVolume2 \\ Program Files \\ Microsoft Office \\ Office12 \\ MSACCESS.EXE tepad ++ \\ notepad ++。exe
注意第二个调用结果的末尾有\“ tepad ++ \\ notepad ++。exe \”吗?不要误以为它落在第二行上。它都是同一字符串的一部分,并且在第二次调用此函数时全部返回。
有什么想法为什么我的函数会返回这个?看起来这是一个全局字符串变量没有被清除的问题,但是我几乎完全按照我发布的代码使用它。没有全局变量。
没有找到相关结果
已邀请:
3 个回复
荒劫娇噬
文档没有明确地说返回值是路径的长度,只是复制的缓冲区的长度,似乎不是同一回事。如果函数成功,则返回值指定复制到缓冲区的字符串的长度。 这意味着您需要:
剃摧庭峨僳
抹持奠糙驰