Имя: Пароль:
IT
 
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) Чуть допилил, заработало. Спасибо
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший