Страница: 1 |
Страница: 1 |
Вопрос: Закрыть EXE
Добавлено: 30.01.05 17:11
Автор вопроса: Calhoon | Web-сайт:
Запускаю EXE с помощью Shell(). Как потом его закрыть/убить?
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 30.01.05 17:32
1. OpenProcess где ProcessID есть то что тебе вернул Shell
2. TerminateProcess c тем что тебе вернул OpenProcess
3. CloseHandle с тем что тебе вернул... нет не угадал не TerminateProcess а OpenProcess
Номер ответа: 2
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #2
Добавлено: 30.01.05 20:38
)
Пасибо, т.к. я тоже хотел задать этот вопрос
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 30.01.05 20:38
Public Sub KillProc(KillProcName$())
Dim NP$(100)
Dim mass(100) As Long
Snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
proc.dwSize = Len(proc)
TheLoop = ProcessFirst(Snap, proc)
Index = 0
While TheLoop <> 0
NP$(Index) = Replace(proc.szExeFile, Right(proc.szExeFile, 1), ""
mass(Index) = proc.th32ProcessID
Index = Index + 1
TheLoop = ProcessNext(Snap, proc)
Wend
CloseHandle Snap
For i% = LBound(KillProcName$) To UBound(KillProcName$)
Kick$ = KillProcName$(i
For q% = 0 To Index
If Left(Spliting(NP$(q, "\", Len(Kick$)) = Kick$ Then
openproc = OpenProcess(1, 0, mass(q)
term = TerminateProcess(openproc, -9)
End If
Next q%
Next i%
End Sub
--------------------------------
модуль
Public proc As PROCESSENTRY32, Snap As Long
Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Const TH32CS_SNAPPROCESS = &H2, TH32CS_SNAPheaplist = &H1, TH32CS_SNAPthread = &H4, TH32CS_SNAPmodule = &H8, TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule, MAX_PATH As Integer = 260
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Function Spliting(sFullPath As String, point As String)
On Error Resume Next
Dim str1() As String
str1 = Split(sFullPath, point)
Spliting = str1(UBound(str1))
End Function
-------------------------------
использовать
 im KillProcName$(0)
KillProcName$(0) = "proga.exe"
KillProc KillProcName$()
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 30.01.05 23:20
2Hacker, а процессов с одним именем может быть несколько
Да и вопрос ьыл как после Shell закрыть процесс
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 31.01.05 08:08
Проще найти окно этого exe и послать WM_QUIT. Конечно, зависит от exe.
Номер ответа: 6
Автор ответа:
someone
Вопросов: 215
Ответов: 1596
Web-сайт:
Профиль | | #6
Добавлено: 02.02.05 11:13
все это ненадежно, я как-то пробовал. есть такая прога CCTask - вот это действует. она отлавливает все процессы, т.е. например, проводник она отображает,как "C:\WIN\EXPLORER.EXE". Убивает моментально. Правда иногда виснет =(
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 02.02.05 12:05
2LamerOnLine, а если в приложении окон несколько !?
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 03.02.05 10:57
Посылать WM_CLOSE каждому, либо Top-Level окну.
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 03.02.05 11:09
Все равно приложение не закроется, пробовано
Т.ч. я использовал вот что: по PID перебирал все окошки в системе, смотрел на их принадлежность процессу и закрывал их... а уже потом если процесс так и небыл закры, его убивал...
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 03.02.05 11:10
Тут можно подойти с двух сторон - GetWindowThreadProcessId и EnumProcessModules. Проблема в том, что и окна и процессы могут иметь повторяющиеся имена. Думаю, тут лучше запускать через ShellExecuteEx.
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 03.02.05 11:13
Кстати, sne, думается что лучше использовать CreateProcess нежели OpenProcess и Shell...
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 03.02.05 11:16
Меня интересует другое, что уже неоднократно спрашивалось - возможно ли запустить процесс не с диска, а из памяти? Кто-нить с этим разбирался?
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 03.02.05 11:21
Т.ч. я использовал вот что: по PID перебирал все окошки в системе, смотрел на их принадлежность процессу и закрывал их... а уже потом если процесс так и небыл закры, его убивал...
Разумеется, смотря что за процесс. Если это что-то вроде простого VB приложения с несколькими формами - должен закрыться, а ежели там что-то вроде
[CODE]
Sub Main()
Do
Loop
End Sub
разумеется так его не закроешь :)