Страница: 1 |
Страница: 1 |
Вопрос: Task Manager
Добавлено: 15.06.07 19:56
Автор вопроса: Иван | Web-сайт:
Дорогие друзья,
Подскажите, пожалуйста, как можно узнать имя исполнимого файла программы и/или путь к нему, если хэндл программы в Task Manager известен.
Заранее благодарен.
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #1
Добавлено: 15.06.07 22:45
наверное, окна? (HWND)
Раньше можно было просто GetWindowModuleFileName.
Сейчас сложнее, последовательность такая:
GetWindowThreadProcessId
OpenProcess
EnumProcessModules
GetModuleFileNameEx
CloseHandle
на VB код громоздкий
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 16.06.07 11:37
Думаю, имелся ввиду PID. Тогда задача сводится к твоему списку, начиная с OpenProcess.
Номер ответа: 3
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #3
Добавлено: 16.06.07 17:32
Вот, проверил, на VB тоже все просто
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi" (ByVal hProcess As Long, ByVal lphModule As Long, ByVal cb As Long, ByVal lpcbNeeded As Long) As Long
Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10
Private Sub Form_Load()
Dim pid As Long
pid = GetPidFromHwnd(Me.hwnd)
Debug.Print GetFileFromPid(pid)
End Sub
Private Function GetPidFromHwnd(hwnd As Long) As Long
Call GetWindowThreadProcessId(hwnd, GetPidFromHwnd)
End Function
Private Function GetFileFromPid(pid As Long) As String
Dim hprocs As Long
Dim retstr As String * 560
Dim cbstr As Integer
Dim hmodul As Long
Dim cbNeeded As Long
hprocs = OpenProcess(PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION, 0, pid)
If hprocs Then
If EnumProcessModules(hprocs, VarPtr(hmodul), 4, VarPtr(cbNeeded)) Then
cbstr = GetModuleFileName(hmodul, retstr, 560)
GetFileFromPid = Left(retstr, cbstr)
End If
End If
End Function
Номер ответа: 4
Автор ответа:
Иван
Вопросов: 34
Ответов: 53
Web-сайт:
Профиль | | #4
Добавлено: 17.06.07 00:56
Глубокоуважаемый EYGU,
Большое Вам спасибо за помощь, за подробный обстоятельный ответ. От души желаю Вам успехов.
Поначалу я не мог найти функции EnumProcessModules: ApiViewer ее не показывает. Или у меня инсталлированы не все списки? (VB6)
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 17.06.07 12:21
Эта функция доступна только на NT4, 2000, XP и Vista, для всех Windows следует использовать CreateToolhelp32Snapshot с параметром TH32CS_SNAPMODULE