Страница: 1 |
Страница: 1 |
Вопрос: Процессы
Добавлено: 01.03.06 20:11
Автор вопроса: SL | ICQ: 277007669
Мне нужно узнать hModule процесса по ProcessID или hProcess. Кто знает, помогите!
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 01.03.06 21:03
Модулей у процессов несколько, какой именно hModule тебе нужен? И уточни, что подразумеваешь под hModule.
Номер ответа: 2
Автор ответа:
piv
ICQ: 333346191
Вопросов: 6
Ответов: 21
Профиль | | #2
Добавлено: 01.03.06 21:29
EnumProcessModules - если у тебя NT или выше
Номер ответа: 3
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #3
Добавлено: 01.03.06 21:35
Хотел найти путь к файлу по процессу. В GetModuleFileName надо указать hModule. Мне нужен сам exe файл.
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 01.03.06 21:54
1. Вызываешь CreateToolhelp32Snapshot + TH32CS_SNAPPROCESS и получашь hSnapshot запущенных процессов
2. передаешь этот hSnapshot в Process32First вместе со структурой PROCESSENTRY32 для заполнения структуры. Process32First заполнит структуру данными первого процесса
3. Последовательно в цикле вызываешь Process32Next, которая будет заполнять и возвращать структуру для всех процессов. Вот в этом цикле после каждого вызова Process32Next проверяешь поле th32ProcessID у структуры PROCESSENTRY32. Когда это поле совпадёт с твоим ProcessID - значит в структуре хранятся данные твоего процесса. И конкретно имя файла - в поле szExeFile.
4. После цикла вызвать CloseHandle для hSnapshot
Номер ответа: 5
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #5
Добавлено: 01.03.06 21:58
По-моему Windows'ы на NT-платформе возвращают только имя файла (во всяком случае - XP)
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 01.03.06 22:30
Если нужен полный путь к файлу, то вызываешь
CreateToolhelp32Snapshot+TH32CS_SNAPMODULE+ProcessID и получашь hModuleSnapshot и затем
Module32First + hModuleSnap + структура MODULEENTRY32 для заполнения. Достаточно одного вызова Module32First, т.к. ехе-шник будет стоять первым в списке модулей, и в заполненной Module32First структуре поле szExePath будет содержать полный путь к ехе.
Номер ответа: 7
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #7
Добавлено: 02.03.06 10:54
Тогда в чём ошибка:
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPMODULE As Long = &H8
Private Declare Function Module32First Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As MODULEENTRY32) As Long
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * 9
szExeFile As String * 260
End Type
Dim c As MODULEENTRY32
Private Sub Form_Load()
Dim a, b As Long
On Error Resume Next
a = InputBox("Введите ProcessID:", "Процесс"
b = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, a)
Module32First b, c
MsgBox c.szExeFile
End Sub
В переменной c всё пусто!
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 02.03.06 11:27
Задрали вы уже снэпшотами. Тормозные они.
EnumProcessModules - руль. Кстати, экзешник всегда идет первым хендлом в массиве.
На ошибки обработаешь сам
Option Explicit
Option Base 1
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_READ = 16
Private Function GetFileNameFromID(ByVal PID As Long) As String
On Error Resume Next
Dim hProcess As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
If hProcess = 0 Then
GetFileNameFromID = "Error " & Err.LastDllError
Exit Function
End If
Dim hModules() As Long, hModSize As Long, hModNeeded As Long
hModSize = 1024
ReDim hModules(hModSize)
Do
EnumProcessModules hProcess, hModules(1), hModSize * 4, hModNeeded
If hModNeeded <= hModSize * 4 Then Exit Do
Loop
Dim FileName As String
FileName = Space(1024)
GetModuleFileNameEx hProcess, hModules(1), FileName, 1024
GetFileNameFromID = Trim$(FileName)
CloseHandle hProcess
End Function
Private Sub Form_Load()
MsgBox GetFileNameFromID(1024) 'Any ProcessID
End Sub
Номер ответа: 9
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #9
Добавлено: 02.03.06 11:32
Пасиба
Номер ответа: 10
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #10
Добавлено: 02.03.06 11:32
Пасиба