Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Task Manager Добавлено: 15.06.07 19:56  

Автор вопроса:  Иван | Web-сайт: www.harami.ru
Дорогие друзья,
Подскажите, пожалуйста, как можно узнать имя исполнимого файла программы и/или путь к нему, если хэндл программы в 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: www.harami.ru
 Профиль | | #4
Добавлено: 17.06.07 00:56
Глубокоуважаемый EYGU,
Большое Вам спасибо за помощь, за подробный обстоятельный ответ. От души желаю Вам успехов.

Поначалу я не мог найти функции EnumProcessModules: ApiViewer ее не показывает. Или у меня инсталлированы не все списки? (VB6)

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 17.06.07 12:21
Эта функция доступна только на NT4, 2000, XP и Vista, для всех Windows следует использовать CreateToolhelp32Snapshot с параметром TH32CS_SNAPMODULE

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам