Страница: 1 | 2 | 3 |
Вопрос: Очччень Нужна прога...
Добавлено: 20.08.04 02:44
Автор вопроса:
Lister | ICQ: 298621256
Ответы
Всего ответов: 35
Номер ответа: 16
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #16
Добавлено: 21.08.04 02:31
Может я покажусь полным балбесом, но что в lpModuleName указывать???
Путь к экзешнику или имя экзешника
Номер ответа: 17
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #17
Добавлено: 21.08.04 02:36
Это я к тому что у меня ни то ни то не работает
Номер ответа: 18
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #18
Добавлено: 21.08.04 05:39
Вот так находить экзешник по PID. Добавь на форму ListBox. После запуска щёлкни по форме. Должен появиться msgbox c именем проги. Имя найдено по hWnd. Код переделан с Power Basic. А написал его ни кто иной как Семен Матусовски. Если тебе конечно это имя о чём то говорит.
===
Option Explicit
Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.dll" ( _
ByVal dwFlags As Long, _
ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPPROCESS = &H2
Private Const INVALID_HANDLE_VALUE = &HFFFFFFFF
Private Const MAX_MODULE_NAME32 = 255
Private Const MAX_MODULE_NAME32_1 = MAX_MODULE_NAME32 + 1
Private Const MAX_PATH = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long ' This process
th32DefaultHeapID As Long 'PTR
th32ModuleID As Long ' Associated exe
cntThreads As Long
th32ParentProcessID As Long ' This process's parent process
pcPriClassBase As Long ' Base priority of process threads
dwFlags As Long
szExeFile As String * MAX_PATH ' Path
End Type
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long ' This module
th32ProcessID As Long ' Owning process
GlblcntUsage As Long ' Global usage count on the module
ProccntUsage As Long ' Module usage count in th32ProcessID's context
modBaseAddr As Byte 'PTR ' Base address of module in th32ProcessID's context
modBaseSize As Long ' Size in bytes of module starting at modBaseAddr
hModule As Long ' The hModule of this module in th32ProcessID's context
szModule As String * MAX_MODULE_NAME32_1
szExePath As String * MAX_PATH
End Type
Private Declare Function Process32First Lib "KERNEL32.dll" ( _
ByVal hSnapshot As Long, _
ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "KERNEL32.dll" ( _
ByVal hSnapshot As Long, _
ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Module32First Lib "KERNEL32.dll" ( _
ByVal hSnapshot As Long, _
ByRef lpme As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "KERNEL32.dll" ( _
ByVal hSnapshot As Long, _
ByRef lpme As MODULEENTRY32) As Long
Private Declare Function CloseHandle Lib "KERNEL32.dll" ( _
ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByRef lpdwProcessId As Long) As Long
Private Sub Form_Click()
 im MyPID As Long
GetWindowThreadProcessId Me.hwnd, MyPID
 im pe1 As PROCESSENTRY32
 im me1 As MODULEENTRY32
 im hProcessSnap As Long
 im hModuleSnap As Long
 im nModules As Long
 im nProcesses As Long
 im hProcess As Long
 im lResult1 As Long
 im lResult2 As Long
 im cb As Long
 im cbNeeded As Long
 im i As Long
 im j As Long
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&
If hProcessSnap = INVALID_HANDLE_VALUE Then MsgBox "Error", 16, "CreateToolhelp32Snapshot": Exit Sub
pe1.dwSize = Len(pe1)
lResult1 = Process32First(hProcessSnap, pe1)
While lResult1 <> 0
List1.AddItem pe1.szExeFile
If pe1.th32ProcessID = MyPID Then MsgBox pe1.szExeFile, 64
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe1.th32ProcessID)
If hModuleSnap <> INVALID_HANDLE_VALUE Then
me1.dwSize = Len(me1)
lResult2 = Module32First(hModuleSnap, me1)
While lResult2 <> 0
If pe1.th32ModuleID <> me1.th32ModuleID Then
List1.AddItem " " & me1.szExePath
End If
lResult2 = Module32Next(hModuleSnap, me1)
Wend
CloseHandle hModuleSnap
End If
lResult1 = Process32Next(hProcessSnap, pe1)
Wend
CloseHandle hProcessSnap
End Sub
Номер ответа: 19
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #19
Добавлено: 21.08.04 15:38
я аналогичный код использовал чтобы найти и убить процесс...
у меня еще встречный вопрос - а можно ли найти путь и имя экзешника, зная hWnd его окна?
Тут просто мысли появились перебрать все окна по EnumWindows...
Номер ответа: 20
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 21.08.04 17:15
Это есть в примере, который я тебе написал. Посмотри его ещё раз.
Номер ответа: 21
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #21
Добавлено: 21.08.04 17:31
Дело в том, что в примере показывается не путь к экзешнику... а только имя.
Поэтому я и спросил про путь...
Номер ответа: 22
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #22
Добавлено: 21.08.04 19:04
У меня получилось закрывать приложение по имени экзешника. Но это только половина дела. Желательно бы закрывать его по пути к экзешнику...
Номер ответа: 23
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #23
Добавлено: 21.08.04 19:16
могу прислать пример для изучения
Номер ответа: 24
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #24
Добавлено: 21.08.04 20:00
Кстати, следующий кусок из примера у меня не работает:
lResult2 = Module32First(hModuleSnap, me1)
While lResult2 <> 0
If pe1.th32ModuleID <> me1.th32ModuleID Then
List1.AddItem " " & me1.szExePath
End If
lResult2 = Module32Next(hModuleSnap, me1)
Wend
CloseHandle hModuleSnap
Номер ответа: 25
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #25
Добавлено: 21.08.04 20:00
lResult2 всегда равен нулую
Номер ответа: 26
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #26
Добавлено: 22.08.04 00:01
Нашёл где ошибка.
Private Type MODULEENTRY32
...
modBaseAddr As Byte 'PTR ' Base address of module in th32ProcessID's context
...
End Type
Неправильно перевёл Byte PTR с Power Basic'а.
Не, я конечно знаю что длина адреса может быть только Long, но вот нашло что то.
Вот так надо:
Private Type MODULEENTRY32
...
modBaseAddr As Long
...
End Type
Хотя раз в API-Guide это есть, то тебе и флаг в руки. И изобретать ничего не надо. Глянул как в примере, а дальше на что фантазии хватит.
>Дело в том, что в примере показывается не путь к экзешнику... а только имя.
Поэтому я и спросил про путь...
- В 98-й имя вместе с путём идёт. А на ХР на ощупь я тебе никак не помогу. Спроси кого другого.
sne например.
Номер ответа: 27
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #27
Добавлено: 22.08.04 00:25
можно сказать, что я уже разобрался... остались только мелочи - написать все это
Да, я посмотрел в 98-м - действительно, идет с путями... Кстати, если в ХР откомпилированный проект запустить в режиме совместимости с Windows 9x - то тоже все работает как и хотелось.
В общем, как только программку напишу, я её в примеры на сайт закину, может кому пригодиться
Номер ответа: 28
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #28
Добавлено: 22.08.04 01:14
Для XP другие функции есть. EnumProcesses из PSAPI.DLL
Номер ответа: 29
Автор ответа: Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #29
Добавлено: 22.08.04 01:21
Эти тоже начали работать - после поправки MODULEENTRY32
Номер ответа: 30
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #30
Добавлено: 22.08.04 02:28
Я кстати сам с этой хренью только прошлой ночью разобрался. Так что спасибо тебе
Пол ночи возился. Пытался подключить PSAPI.DLL через LoadLibrary. Естественно у меня ничего не вышло. Однако пока я ковырял эту библу я нашёл в ней одну странность. У неё SubSytem=3.
Вот только вывод пока из этого сделать не могу. Может кто в XP-шке разбирается подскажет почему так?