Я использую код ниже, чтобы получить путь к файлу и имя для данного процесса.Я просто передаю 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 \ Программные файлы \ Portable Apps \ Notepad ++ Portable \ App \ Notepad ++ \ notepad ++. Exe
Второй вызов (неожиданные результаты):
\ Device \ HarddiskVolume2 \ Program Files \ Microsoft Office \ Office12 \ MSACCESS.EXE tepad ++ \ notepad ++. Exe
Обратите внимание на "tepad ++"\ notepad ++. exe "в конце результатов для второго вызова?Не обманывайтесь тем фактом, что он попадает на вторую строку.Все это часть одной и той же строки и все возвращается при втором вызове этой функции.
Есть идеи, почему моя функция возвращает это?Может показаться, что проблема глобальной строковой переменной не очищается, но я использую код почти так же, как я его опубликовал.Нет глобальных переменных.