Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.11.2012, 17:21
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию при втором вызове функция не работает

подскажите почему функция при втором вызове не убивает процесс?
т.е. есть 1.exe и 2.exe. оба запущены. при вызове DebugKillProcess(GetProcessId('1.exe')); процесс закрывается. еще раз вызываем DebugKillProcess(GetProcessId('2.exe')); процесс не закрывается



Код:
function TForm1.DebugKillProcess(ProcessId: dword): boolean;
var
 pHandle: dword;
 myPID: dword;
 HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
 r: dword;
begin
 Result := false;
 myPID := GetCurrentProcessId();
 if not EnableDebugPrivilege() then Exit;
 if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
 pHandle := OpenProcessEx(ProcessId);
 if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;
 HandlesInfo := GetInfoTable(SystemHandleInformation);
 if HandlesInfo = nil then Exit;
 for r := 0 to HandlesInfo^.NumberOfHandles do
  if (HandlesInfo^.Information[r].ProcessId = myPID) and
     (HandlesInfo^.Information[r].ObjectTypeNumber = $8) 
     then begin
       CloseHandle(HandlesInfo^.Information[r].Handle);
       Result := true;
       break;
     end;
 VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;
Ответить с цитированием
  #2  
Старый 04.11.2012, 19:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kudesnik
подскажите почему функция при втором вызове не убивает процесс?
т.е. есть 1.exe и 2.exe. оба запущены. при вызове DebugKillProcess(GetProcessId('1.exe')); процесс закрывается. еще раз вызываем DebugKillProcess(GetProcessId('2.exe')); процесс не закрывается
Ну так ты обрабатывай ошибки вместо того чтобы при ошибках тихонько выходить по Exit.
Т.е. вместо, например, такого:
Код:
if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
Делай примерно так:
Код:
var
  err: DWORD;
.....
begin
.....
  err := DbgUiConnectToDbg();
  if err <> STATUS_SUCCESS then
    raise Exception.CreateFmt('Ошибка №%d: "%s"', [err, SysErrorMessage(err)]);

p.s. И чем не подходит завершение процесса через обычный TerminateProcess ?
Ответить с цитированием
  #3  
Старый 04.11.2012, 19:35
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию

дело в том что в программе нет ошибки...и она сама не завершается.
Ответить с цитированием
  #4  
Старый 04.11.2012, 19:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kudesnik
дело в том что в программе нет ошибки...и она сама не завершается.
О какой программе речь? О той которую нужно завершить или о той которая завершает чужой процесс?
Ответить с цитированием
  #5  
Старый 04.11.2012, 19:50
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию

моя программа завершает 1.exe
после 2.exe не завершается, но моя прога при этом не выходит и не зависает. причина в чем то другом
Ответить с цитированием
  #6  
Старый 04.11.2012, 20:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kudesnik
моя программа завершает 1.exe
после 2.exe не завершается, но моя прога при этом не выходит и не зависает. причина в чем то другом
А через TerminateProcess завершает?:
Код:
TerminateProcess(GetProcessId('2.exe'), 0);
Ответить с цитированием
  #7  
Старый 04.11.2012, 20:39
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А через TerminateProcess завершает?:

2.exe - пустое delphi приложение. так что TerminateProcess должен работать
Ответить с цитированием
  #8  
Старый 04.11.2012, 20:41
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию

прочитал вот что про эту функцию...

Цитата:
На 1 DebugObject можно повесить множество процессов при помощи DbgUiDebugActiveProcess и потом их всех прибить. Плохая: невозможно создать DebugObject после его завершения. Т.е. объект создать можно ZwCreateDebugObject, но вот подключить его нельзя ((

обойти это никак?
Ответить с цитированием
  #9  
Старый 04.11.2012, 20:44
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Когда процесс не получается завершить, то какие ошибки возвращает?
Ответить с цитированием
  #10  
Старый 04.11.2012, 21:04
kudesnik kudesnik вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 21
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Когда процесс не получается завершить, то какие ошибки возвращает?

if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;

ошибка №-1073741788: ""

Последний раз редактировалось kudesnik, 04.11.2012 в 21:06.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter