Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение работы программы в диспетчере задач 
:(
    Опции темы
sneJok
Дата 21.12.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Нужно отловить событие при завершении работы приложения (Диспетчер задач-Процессы-Завершить процесс).
Цель задачи - при завершении процесса номер 1, завершить еще и процесс номер 2.
PM MAIL   Вверх
Beltar
Дата 21.12.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



А сам процесс 1 перед смертью не может убить и процесс 2?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
dumb
Дата 21.12.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



нужно добавить функциональность мониторинга состояния "напарника" в оба приложения. альтернативой могут являться всяческие глобальные перехваты api, сервисы, драйверы - но вряд ли оно того стОит.

а проще всего - поставить nnCron и сделать в нем соответствующее задание. таким образом ты используешь уже готового наблюдателя, который, к тому же, еще много чего умеет... smile

Цитата(Beltar @  21.12.2007,  15:38 Найти цитируемый пост)
А сам процесс 1 перед смертью не может убить и процесс 2?
нет. "завершить процесс" - это как выстрел в затылок: убиваемый процесс не получает никаких уведомлений и ничего не может сделать.
PM MAIL   Вверх
sneJok
Дата 21.12.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Мониторинг, к сожалению, не подойдёт, т.к. исходного кода процесса 2 нет.

Есть еще каки-либо альтернативные методы? Процесс 2 запускаеться непосредственно только через процесс 1. Как бы их связать...

Это сообщение отредактировал(а) sneJok - 21.12.2007, 16:07
PM MAIL   Вверх
dumb
Дата 21.12.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(sneJok @  21.12.2007,  15:51 Найти цитируемый пост)
т.к. исходного кода процесса 2 нет. <skip> Процесс 2 запускаеться непосредственно только через процесс 1
вот всегда говорил - описывайте точнее... это ж совсем другое дело! smile

сразу пара вариантов всплыли. один - через job-object'ы + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, но оно только начиная с XP поддерживается.
а второй - самый подходящий: запускать чайлд-процесс с флагом отладки(DEBUG_PROCESS). набросал тебе пример. на дельфи. бррр... простите, дельфисты, вырвалось... smile
Unit1.pas:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  ted: TExecDebug;
begin
  ted := TExecDebug.Create(false, 'C:\windows\system32\notepad.exe', '');
end;

end.


Unit2.pas:
Код

unit Unit2;

interface

uses
  Classes, Windows;

type
  TExecDebug = class(TThread)
  private
    FExe: String;
    FArg: String;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean; Exe, Arg: String);
  end;

implementation

{ TExecDebug }
constructor TExecDebug.Create(CreateSuspended: Boolean; Exe, Arg: String);
begin
  FExe := Exe;
  FArg := Arg;
  inherited Create(CreateSuspended);
end;

procedure TExecDebug.Execute;
var
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
  ed: DEBUG_EVENT;
begin
  FreeOnTerminate := true;
  FillChar(si, sizeof(si), 0);
  si.cb := sizeof(si);
  if CreateProcess(PChar(FExe), PChar(FArg),
                   nil, nil, FALSE, DEBUG_PROCESS,
                   nil, nil, si, pi) then begin
    while not Terminated do begin
      WaitForDebugEvent(ed, INFINITE);
      ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
    end;
    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );
  end;
end;

end.

PM MAIL   Вверх
sneJok
Дата 21.12.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Спасибо огромное! Буду разбираться.
PM MAIL   Вверх
sneJok
Дата 25.2.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Решил сделать через Job'ы.
Код - 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}
uses jobapi;


procedure TForm1.Button1Click(Sender: TObject); 
 var
  hjob:hwnd;
  si: TStartupInfo;
  res:longbool;
   pi: TProcessInformation;
begin
hjob:=CreateJobObject(nil, 'j1');
AssignProcessToJobObject(hjob, GetCurrentProcess());
GetStartupInfo(si);
CreateProcess(nil, 'calc.exe', nil, nil,false, JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, nil, nil, si, pi);
AssignProcessToJobObject(hjob, pi.hProcess);
if IsProcessInJob(pi.hProcess,pi.hProcess,res) then showmessage('work in one job');
end;


end.



Посмотрел pi.hProcess (по сути PID?), отличается от настоящего значения PID. В чем ошибка?

Это сообщение отредактировал(а) sneJok - 25.2.2008, 19:14
PM MAIL   Вверх
MetalFan
Дата 25.2.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(sneJok @  25.2.2008,  19:13 Найти цитируемый пост)
Посмотрел pi.hProcess (по сути PID?),

с чего бы это?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 25.2.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(sneJok @  25.2.2008,  19:13 Найти цитируемый пост)
CreateProcess(nil, 'calc.exe', nil, nil,false, JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, nil, nil, si, pi);
smile

Код

var
  hJob: THandle;
  si: TStartupInfo;
  pi: TProcessInformation;
  jel: JOBOBJECT_EXTENDED_LIMIT_INFORMATION;
begin
  FillChar(si, sizeof(si), 0);
  si.cb := sizeof(si);
  if CreateProcess(nil, 'calc.exe', nil, nil, false, 0, nil, nil, si, pi) then begin
    hJob := CreateJobObject(nil, 'MyJob');
    if hJob <> 0 then begin
      FillChar(jel, sizeof(jel), 0);
      jel.BasicLimitInformation.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
      if SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, jel, sizeof(jel)) <> 0 then begin
        AssignProcessToJobObject(hJob, GetCurrentProcess());
        AssignProcessToJobObject(hJob, pi.hProcess);
      end
      else
        ShowMessage(SysErrorMessage(GetLastError()));
    end;
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
  end;
...


PM MAIL   Вверх
Poseidon
Дата 25.2.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(sneJok @  21.12.2007,  15:51 Найти цитируемый пост)
Мониторинг, к сожалению, не подойдёт, т.к. исходного кода процесса 2 нет.

Есть еще каки-либо альтернативные методы? Процесс 2 запускаеться непосредственно только через процесс 1. Как бы их связать...
 Создай процесс 3, который и будет тем самым монитором первых двух процессов. Убит процесс1, процесс3 убивает процесс2 и убивается сам smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
sneJok
Дата 23.3.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Большое спасибо за советы!
Подскажите, какую нужно подключить библиотеку для работы с Job функциями для D7?
PM MAIL   Вверх
Rennigth
Дата 24.3.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Цитата(sneJok @  23.3.2008,  19:49 Найти цитируемый пост)
Подскажите, какую нужно подключить библиотеку для работы с Job функциями для D7? 

Код

function CreateJobObjectA(lpJobAttributes: PSecurityAttributes;
  lpName: LPCTSTR): THandle; stdcall; external kernel32;

function AssignProcessToJobObject(hJob: THandle; hProcess: THandle): LongBool; stdcall; external kernel32;



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Poseidon
Дата 25.3.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(sneJok @  23.3.2008,  19:49 Найти цитируемый пост)
Подскажите, какую нужно подключить библиотеку для работы с Job функциями для D7?
Один топик - один вопрос



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.