![]() |
![]() |
![]() |
|
Delphi: Как можно закрыть приложение, имея его Handle? | ☑ | ||
---|---|---|---|---|
0
1Сергей
10.06.11
✎
13:59
|
помогите, плз
|
|||
1
ДенисЧ
10.06.11
✎
14:01
|
У приложения есть handle?
Может, хэндл его главного окна? тогда пошли ему wm_close... |
|||
2
H A D G E H O G s
10.06.11
✎
14:02
|
(1) Есть
|
|||
3
ДенисЧ
10.06.11
✎
14:02
|
(2) хм....
|
|||
4
1Сергей
10.06.11
✎
14:03
|
(1) понял, спс
|
|||
5
H A D G E H O G s
10.06.11
✎
14:03
|
Тупо
CloseHandle() |
|||
6
H A D G E H O G s
10.06.11
✎
14:03
|
Не перепутал PID и Handle ?
|
|||
7
1Сергей
10.06.11
✎
14:04
|
(6) получен с помощью ShellExecute
|
|||
8
H A D G E H O G s
10.06.11
✎
14:05
|
(0) Ну и жестоко:
TerminateProcess() |
|||
9
H A D G E H O G s
10.06.11
✎
14:08
|
(7) Да, Handle
|
|||
10
1Сергей
10.06.11
✎
14:33
|
TerminateProcess(processHandle, 0);
CloseHandle(ProcessHandle); вываливается в external exception |
|||
11
MM
10.06.11
✎
14:37
|
(5) этого не достаточно
(10) после TerminateProcess вываливаться процессу вроде поздно, похоже ошибку выдаёт какое-то другое приложение с ним связанное. |
|||
12
H A D G E H O G s
10.06.11
✎
14:39
|
(11) Если привелегии есть - достаточно.
|
|||
13
1Сергей
10.06.11
✎
14:41
|
Закоментил CloseHandle
ошибок не даёт, но и не закрывает |
|||
14
nop
10.06.11
✎
14:43
|
(2) есть, если оно писано на делфи
|
|||
15
famnam
10.06.11
✎
14:43
|
BOOL TerminateProcess(
IN HANDLE hProcess, // описатель процесса IN DWORD dwExitCode // код завершения процесса ); |
|||
16
H A D G E H O G s
10.06.11
✎
14:43
|
(11) Хотя нет.
Вы правы. http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx Closing a thread handle does not terminate the associated thread or remove the thread object. Closing a process handle does not terminate the associated process or remove the process object. To remove a thread object, you must terminate the thread, then close all handles to the thread. For more information, see Terminating a Thread. To remove a process object, you must terminate the process, then close all handles to the process. For more information, see Terminating a Process. |
|||
17
MM
10.06.11
✎
14:43
|
(12) CloseHandle закроет твой процесный дескриптор объекта, сам объект в ядре закроется только с последним закрытым дескриптором, а этот дескриптор держит закрываемый процесс сам на себя. Более того в каждом процессе дескрипторы одного объекта ядра обычно различаются.
|
|||
18
1Сергей
10.06.11
✎
14:45
|
(17) так как его прибить?
|
|||
19
nop
10.06.11
✎
14:47
|
(18) так как это делает taskkill ?
|
|||
20
1Сергей
10.06.11
✎
14:48
|
(19) просто послать команду закрытия
|
|||
21
vde69
10.06.11
✎
14:48
|
закрыть дерево процессов...
вообще TerminateProcess() - прокатить должен |
|||
22
aleks-id
10.06.11
✎
14:48
|
||||
23
1Сергей
10.06.11
✎
14:55
|
Может, как-то Alt-F4 послать?
|
|||
24
aleks-id
10.06.11
✎
14:58
|
TerminateProcess привилегированная функция. она должна выполняться при установленной привилегии SE_DEBUG_NAME
|
|||
25
H A D G E H O G s
10.06.11
✎
15:00
|
Еще можно тупо:
PostMessage(Handle,WM_QUIT,0,0); |
|||
26
aleks-id
10.06.11
✎
15:01
|
(25) а если у процесса будет окно "вы действительно хотите закрыть программу"?
|
|||
27
1Сергей
10.06.11
✎
15:02
|
(26) точно знаю, не будет
|
|||
28
H A D G E H O G s
10.06.11
✎
15:05
|
(26) Этому процессу тоже ничего не поможет.
|
|||
29
ЧеловекДуши
10.06.11
✎
15:05
|
Чезез терминайтед
|
|||
30
1Сергей
10.06.11
✎
15:06
|
Procedure TMainForm.RunGame;
Begin SetCurrentDir(ExtractFileDir(Programs[GameList.ItemFocused.ImageIndex+1])); EmulHandle:=ShellExecute( MainForm.Handle, 'open', PChar(Programs[GameList.ItemFocused.ImageIndex+1]), PChar('"'+FullNames.Strings[GameList.ItemFocused.Index]+'"'), nil, SW_SHOWNORMAL); DXTimer.Interval:=10000; CurrentMode:=1; end; procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer); begin DXInput.Update; if CurrentMode=0 then Begin ... End Else Begin DXTimer.Interval:=20; CurrentMode:=0; showmessage('111'); PostMessage(EmulHandle,WM_QUIT,0,0); //sendmessage(EmulHandle, wm_close,0,0); //TerminateProcess(EmulHandle, 0); //CloseHandle(EmulHandle); End; end; |
|||
31
Эмбеддер
10.06.11
✎
15:10
|
(25) ShellExecute возвращает HINSTANCE, а для сообщений используется HWND, или действительно можно сообщение в HINSTANCE отправлять?
|
|||
32
fellow
10.06.11
✎
15:11
|
||||
33
romix
10.06.11
✎
15:54
|
(0) Если нужно дополнительно выгонять пользователей, то вот у меня здесь есть с оповещением (есть исходник на Дельфи):
Книга знаний: Альтернативное стартовое окно для 1С:Предприятие 7.7 |
|||
34
1Сергей
10.06.11
✎
16:15
|
(33) нет, спасибо, это с 1с не связано
|
|||
35
H A D G E H O G s
10.06.11
✎
16:22
|
(30) Скинь прогу, которую закрываешь
|
|||
36
MMF
10.06.11
✎
16:27
|
(30) убей нафиг ShellExecute, используй CreateProcess + жди без таймера
var si: STARTUPINFO; pi: PROCESS_INFORMATION; begin ZeroMemory(@si, sizeof(si)); si.cb := SizeOf(si); if not CreateProcess(nil, Programs[GameList.ItemFocused.ImageIndex+1] nil, nil, False, 0, nil, nil, si, pi) then begin ShowMessage('Неудачный запуск объекта'); Exit; end; WaitForSingleObject(pi.hProcess, 10000); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); |
|||
37
1Сергей
10.06.11
✎
16:37
|
фух, победил...
Получаю хэндл по имени exe-файла функцией: function search(name:string): Cardinal; var ExeFile : String; PE : TProcessEntry32; FSnap: THandle; begin result:= 0; FSnap:= Tlhelp32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PE.dwSize:= SizeOf(PE); if (Tlhelp32.Process32First(FSnap,PE)) Then Repeat ExeFile:= PE.szExeFile; if pos(pchar(lowercase(name)), lowercase(ExeFile))>0 then Begin result:= PE.th32ProcessID; EmulHandle:= OpenProcess(PROCESS_ALL_ACCESS,False,PE.th32ProcessID); break End; Until Not Process32Next(FSnap,PE) end; и 10 отрабатывает |
|||
38
MMF
10.06.11
✎
16:46
|
(37) извращение и уродство. Искать созданный самим собой процесс
|
|||
39
1Сергей
10.06.11
✎
16:47
|
(36) что такое STARTUPINFO?
|
|||
40
1Сергей
10.06.11
✎
16:49
|
и что делает WaitForSingleObject(pi.hProcess, 10000); ?
|
|||
41
H A D G E H O G s
10.06.11
✎
16:53
|
(39) (40) Это он херь написал, не разобравшись в задаче
|
|||
42
1Сергей
10.06.11
✎
16:54
|
(41) оно запускается, но не закрывается
|
|||
43
1Сергей
10.06.11
✎
16:59
|
(36) Чуть допилил, заработало. Спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |