Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- procedure WMSTOPMYWORK(var M: TMessage); message WM_STOPMYWORK;
- PostMessage(HWND_BROADCAST, WM_STOPMYWORK, 0, WORKER_ID);
- program KillTest;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- System.SysUtils, System.SyncObjs,
- WinApi.Windows;
- procedure DoWork();
- begin
- Writeln('Worker');
- while True do begin
- Sleep(500);
- end;
- end;
- procedure CreateWaitKillWorker(const ExeName: String);
- var
- Si: TStartupInfo;
- Pi: TProcessInformation;
- CommandLine: String;
- begin
- Writeln('Manager');
- CommandLine := ExeName + ' -C';
- Si := Default(TStartupInfo);
- Si.cb := sizeof(si);
- if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin
- try
- Sleep(5000);
- TerminateProcess(Pi.hProcess, 0);
- finally
- CloseHandle(Pi.hProcess);
- CloseHandle(Pi.hThread);
- end;
- end;
- Readln;
- end;
- var
- ChildProcExeName: String;
- begin
- try
- ChildProcExeName := ParamStr(0);
- if ParamCount > 0 then
- DoWork()
- else
- CreateWaitKillWorker(ChildProcExeName);
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- end.
- program KillTest;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- System.SysUtils, System.SyncObjs,
- WinApi.Windows;
- procedure DoWork();
- var
- Event: TEvent;
- begin
- Writeln('Worker');
- Event := TEvent.Create(nil, True, False, 'Test');
- try
- while Event.WaitFor(0) = TWaitResult.wrTimeout do begin
- Sleep(2000);
- end;
- finally
- Event.Free;
- end;
- end;
- procedure CreateWaitKillWorker(const ExeName: String);
- var
- Si: TStartupInfo;
- Pi: TProcessInformation;
- CommandLine: String;
- Event: TEvent;
- begin
- Writeln('Manager');
- CommandLine := ExeName + ' -C';
- Si := Default(TStartupInfo);
- Si.cb := sizeof(si);
- Event := TEvent.Create(nil, True, False, 'Test');
- try
- if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin
- try
- Sleep(5000);
- Event.SetEvent();
- //WaitForSingleObject(Pi.hProcess, INFINITE); // если не обходимо ждать
- finally
- CloseHandle(Pi.hProcess);
- CloseHandle(Pi.hThread);
- end;
- end;
- finally
- Event.Free;
- end;
- Readln;
- end;
- var
- ChildProcExeName: String;
- begin
- try
- ChildProcExeName := ParamStr(0);
- if ParamCount > 0 then
- DoWork()
- else
- CreateWaitKillWorker(ChildProcExeName);
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- end.
- type
- TProcessIDsArray = array of Cardinal;
- procedure TForm2.FormClick(Sender: TObject);
- var
- ProcessID: Cardinal;
- ProcessIDs: TProcessIDsArray;
- begin
- // для примера возьмем свой собственный ID процесса
- GetWindowThreadProcessId(Application.MainFormHandle, ProcessID);
- // задаем размер массива по количеству имеющихся ID процессов
- SetLength(ProcessIDs, 1);
- ProcessIDs[0] := ProcessID;
- // указатель на нашу функцию колбэка и параметр (наш массив с ID)
- EnumWindows(@EnumWindowsProc, lParam(ProcessIDs));
- end;
- function EnumWindowsProc(WindowHandle: HWND; ProcessIDs: TProcessIDsArray): BOOL; stdcall;
- var
- ProcessID: Cardinal;
- i: Integer;
- begin
- Result := True; // будем перебирать все окна
- // получаем ID процесса по хэндлу его главного окна
- GetWindowThreadProcessId(WindowHandle, ProcessID);
- // сравниваем полученный ID с нашим списком
- for i := 0 to Length(ProcessIDs) - 1 do
- if ProcessID = ProcessIDs[i] then
- begin
- // если нашли, отправляем сообщение о закрытии окна
- PostMessage(WindowHandle, WM_CLOSE, 0, 0);
- Exit; // перебирать список процессов дальше не имеет смысла
- end;
- end;
Add Comment
Please, Sign In to add comment