我正在使用下面的代碼來獲取給定進程的文件路徑和名稱。我只是將一個ProcessID傳遞給函數ExePathFromProcID,它應該返回完整路徑。它枚舉硬盤作爲設備而不是使用驅動器盤符,但這不是我的抱怨。看看我的代碼,然後在下面看到我的投訴。通過ProcessID獲取進程路徑和名稱 - 不一致的結果(VB6,VBA)
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
我的抱怨是,由於較長的路徑是首先檢索一個較長的過程路徑的部分仍然會顯示返回一個較短的路徑時,只要。這裏有一個例子:
First Call的(正確的結果):
\設備\ HarddiskVolume2 \ Program Files文件\便攜式APPS \記事本+便攜式\軟件\記事本++ \記事本++ EXE
第二個電話(意想不到的效果。 ):
\設備\ HarddiskVolume2 \ Program Files文件\的Microsoft Office \ OFFICE12 \ MSACCESS.EXE tepad ++ \記事本++ exe文件
公告的 「tepad ++ \記事本++ EXE。」 在結果第二通話結束?不要被它落在第二行的事實所迷惑。它是同一個字符串的全部內容,並且在第二次調用此函數時全部返回。
任何想法,爲什麼我的函數返回此?這似乎是一個全局字符串變量沒有被清除的問題,但我使用的代碼幾乎與我發佈的代碼完全一樣。沒有全局變量。
你在什麼環境下測試?你是否通過返回字符串來檢查一個空字符,將新信息從其餘的舊信息中分離出來? – 2011-06-13 05:31:06