Guest User

Untitled

a guest
Jul 18th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. procedure WMSTOPMYWORK(var M: TMessage); message WM_STOPMYWORK;
  2.  
  3. PostMessage(HWND_BROADCAST, WM_STOPMYWORK, 0, WORKER_ID);
  4.  
  5. program KillTest;
  6.  
  7. {$APPTYPE CONSOLE}
  8.  
  9. {$R *.res}
  10.  
  11. uses
  12. System.SysUtils, System.SyncObjs,
  13. WinApi.Windows;
  14.  
  15. procedure DoWork();
  16. begin
  17. Writeln('Worker');
  18.  
  19. while True do begin
  20. Sleep(500);
  21. end;
  22. end;
  23.  
  24. procedure CreateWaitKillWorker(const ExeName: String);
  25. var
  26. Si: TStartupInfo;
  27. Pi: TProcessInformation;
  28. CommandLine: String;
  29. begin
  30. Writeln('Manager');
  31. CommandLine := ExeName + ' -C';
  32.  
  33. Si := Default(TStartupInfo);
  34. Si.cb := sizeof(si);
  35.  
  36. if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin
  37. try
  38. Sleep(5000);
  39. TerminateProcess(Pi.hProcess, 0);
  40. finally
  41. CloseHandle(Pi.hProcess);
  42. CloseHandle(Pi.hThread);
  43. end;
  44. end;
  45.  
  46. Readln;
  47. end;
  48.  
  49.  
  50. var
  51. ChildProcExeName: String;
  52. begin
  53. try
  54. ChildProcExeName := ParamStr(0);
  55.  
  56. if ParamCount > 0 then
  57. DoWork()
  58. else
  59. CreateWaitKillWorker(ChildProcExeName);
  60. except
  61. on E: Exception do
  62. Writeln(E.ClassName, ': ', E.Message);
  63. end;
  64. end.
  65.  
  66. program KillTest;
  67.  
  68. {$APPTYPE CONSOLE}
  69.  
  70. {$R *.res}
  71.  
  72. uses
  73. System.SysUtils, System.SyncObjs,
  74. WinApi.Windows;
  75.  
  76. procedure DoWork();
  77. var
  78. Event: TEvent;
  79. begin
  80. Writeln('Worker');
  81.  
  82. Event := TEvent.Create(nil, True, False, 'Test');
  83. try
  84. while Event.WaitFor(0) = TWaitResult.wrTimeout do begin
  85. Sleep(2000);
  86. end;
  87. finally
  88. Event.Free;
  89. end;
  90. end;
  91.  
  92. procedure CreateWaitKillWorker(const ExeName: String);
  93. var
  94. Si: TStartupInfo;
  95. Pi: TProcessInformation;
  96. CommandLine: String;
  97. Event: TEvent;
  98. begin
  99. Writeln('Manager');
  100. CommandLine := ExeName + ' -C';
  101.  
  102. Si := Default(TStartupInfo);
  103. Si.cb := sizeof(si);
  104.  
  105. Event := TEvent.Create(nil, True, False, 'Test');
  106. try
  107. if CreateProcess(nil, PChar(CommandLine), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, Si, Pi) then begin
  108. try
  109. Sleep(5000);
  110. Event.SetEvent();
  111. //WaitForSingleObject(Pi.hProcess, INFINITE); // если не обходимо ждать
  112. finally
  113. CloseHandle(Pi.hProcess);
  114. CloseHandle(Pi.hThread);
  115. end;
  116. end;
  117. finally
  118. Event.Free;
  119. end;
  120.  
  121. Readln;
  122. end;
  123.  
  124. var
  125. ChildProcExeName: String;
  126. begin
  127. try
  128. ChildProcExeName := ParamStr(0);
  129.  
  130. if ParamCount > 0 then
  131. DoWork()
  132. else
  133. CreateWaitKillWorker(ChildProcExeName);
  134. except
  135. on E: Exception do
  136. Writeln(E.ClassName, ': ', E.Message);
  137. end;
  138. end.
  139.  
  140. type
  141. TProcessIDsArray = array of Cardinal;
  142.  
  143. procedure TForm2.FormClick(Sender: TObject);
  144. var
  145. ProcessID: Cardinal;
  146. ProcessIDs: TProcessIDsArray;
  147. begin
  148. // для примера возьмем свой собственный ID процесса
  149. GetWindowThreadProcessId(Application.MainFormHandle, ProcessID);
  150.  
  151. // задаем размер массива по количеству имеющихся ID процессов
  152. SetLength(ProcessIDs, 1);
  153. ProcessIDs[0] := ProcessID;
  154.  
  155. // указатель на нашу функцию колбэка и параметр (наш массив с ID)
  156. EnumWindows(@EnumWindowsProc, lParam(ProcessIDs));
  157. end;
  158.  
  159. function EnumWindowsProc(WindowHandle: HWND; ProcessIDs: TProcessIDsArray): BOOL; stdcall;
  160. var
  161. ProcessID: Cardinal;
  162. i: Integer;
  163. begin
  164. Result := True; // будем перебирать все окна
  165.  
  166. // получаем ID процесса по хэндлу его главного окна
  167. GetWindowThreadProcessId(WindowHandle, ProcessID);
  168.  
  169. // сравниваем полученный ID с нашим списком
  170. for i := 0 to Length(ProcessIDs) - 1 do
  171. if ProcessID = ProcessIDs[i] then
  172. begin
  173. // если нашли, отправляем сообщение о закрытии окна
  174. PostMessage(WindowHandle, WM_CLOSE, 0, 0);
  175. Exit; // перебирать список процессов дальше не имеет смысла
  176. end;
  177. end;
Add Comment
Please, Sign In to add comment