С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-16 / 2 / 0
Регистрация: 21.10.2023
Сообщений: 103

Закрытие процесса

02.11.2025, 21:46. Показов 906. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая:
Сервис запускает программу. Программа по какому-либо условию закрывается методом Close.
Программа всё делает нормально за исключением того, что не может закрыться и висит в дереве процессов до закрытия сервиса.
Как отвязать её от сервиса и закрыть, не закрывая самого сервиса?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2025, 21:46
Ответы с готовыми решениями:

Закрытие процесса по его PID и заморозка процесса по его имени или PID
Нужны две вот такие функции закрытие процесса по его PID и заморозка процесса по его имени или PID....

Вызов модальной формы из модальной, нужно:закрытие последней и не закрытие первой.
1. Вызываю модальную форму из главной формы (немодальной). 2. Вызываю другую модальную форму из...

как запретить закрытие процесса на Delphi?
Вот такой вопросик вот процесс как avp.exe это Касперский!ну в общем этот процесс завершить нельзя...

7
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
03.11.2025, 08:26
Не видя Вашего кода ничего предметно сказать нельзя, но судя по Вашим словам:
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
Программа по какому-либо условию закрывается методом Close.
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
и висит в дереве процессов до закрытия сервиса.
появляется подозрение, что "программа" - это не программа, а форма приложения.
Оформите свою "программу" именно как приложение Windows и запускайте ее при помощи CreeateProcess()

Более предметно и более подробно - только при условии показа Вашего кода.
0
-16 / 2 / 0
Регистрация: 21.10.2023
Сообщений: 103
03.11.2025, 08:50  [ТС]
Сервис:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
unit ServiceForm;
 
interface
 
uses  Windows, ShellAPI, Messages, SysUtils, StrUtils, Classes, Controls, Registry, SvcMgr, ScktComp, ElDBCommon, IdTCPServer, IdContext;
 
type
 
  TElDBDispatch = class(TService)
    AppSocket: TServerSocket;
    DBSocket: TServerSocket;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure DBSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure AppSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure DBSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure DBSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure AppSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure AppSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  private
    procedure Execute(AContext: TIdContext);
  public
    function GetServiceController: TServiceController; override;
  end;
 
 
var   ElDBDispatch: TElDBDispatch;
      
 
const sDBName = 'DBName';
      sDBFilename = 'DBFilename';
 
implementation {$R *.dfm}
 
procedure TElDBDispatch.Execute(AContext: TIdContext);
begin
  ...
end;
 
procedure TElDBDispatch.AppSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ...
end;
 
procedure TElDBDispatch.AppSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;
 
procedure TElDBDispatch.AppSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  with Socket do try
    ...
    if ShellExecute(0, 'open', 'ElDatabase.exe', nil, nil, SW_SHOW) > 32 then begin
      ...
    end;
  except
    ...
  end;
end;
 
procedure TElDBDispatch.DBSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ...
end;
 
procedure TElDBDispatch.DBSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;
 
procedure TElDBDispatch.DBSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  ...
end;
 
procedure TElDBDispatch.ServiceCreate(Sender: TObject);
begin
  ...
end;
 
procedure TElDBDispatch.ServiceDestroy(Sender: TObject);
begin
  AppSocket.Close;
  DBSocket.Close;
end;
 
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ElDBDispatch.Controller(CtrlCode);
end;
 
function TElDBDispatch.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
 
end.
Программа:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
unit DBForm;
 
interface
 
uses  Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, ScktComp, IdTCPServer, IdContext, IdBaseComponent, IdComponent, IdCustomTCPServer;
 
type
 
  TDBMain = class(TForm)
    ServerSocket: TClientSocket;
    ClientSocket: TIdTCPServer;
    ...
    procedure ServerSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocketDisconnect(AContext: TIdContext);
    procedure ClientSocketConnect(AContext: TIdContext);
    procedure ClientSocketExecute(AContext: TIdContext);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  end;
 
var   DBMain: TDBMain;
 
implementation {$R *.dfm}
 
procedure TDBMain.ClientSocketExecute(AContext: TIdContext);
begin
  try
    ...
  except
    ...
  end;
end;
 
procedure TDBMain.ClientSocketConnect(AContext: TIdContext);
begin
  Inc(ClientsNum);
  ...
end;
 
procedure TDBMain.ClientSocketDisconnect(AContext: TIdContext);
begin
  Dec(ClientsNum);
  if ClientsNum = 0 then CloseQuery;
end;
 
...
 
procedure TDBMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  ClientSocket.Active := false;
  ServerSocket.Socket.Close;
  CanClose := true;
end;
 
procedure TDBMain.ServerSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Socket.Close;
end;
 
procedure TDBMain.ServerSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;
 
end.
0
Модератор
4134 / 2349 / 807
Регистрация: 15.11.2015
Сообщений: 9,358
03.11.2025, 09:05
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
Программа:
И где в этой программе вызывается Close?

Добавлено через 2 минуты
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
Delphi
1
  if ClientsNum = 0 then CloseQuery;
Неправильно. Нужно писать
Delphi
1
  if ClientsNum = 0 then Close;
, а CloseQuery само вызывается.

Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
Delphi
1
  CanClose := true;
Это лишнее - CanClose и так в true изначально.
0
-16 / 2 / 0
Регистрация: 21.10.2023
Сообщений: 103
03.11.2025, 14:57  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
if ClientsNum = 0 then Close;
Так я тоже писал, результат тот же.
Я так понимаю, что сервис, работая в нулевом кольце, запускает программу тоже в нулевом кольце, поэтому форма программы не отображается (меня это устраивает). Но каким-то образом запущенная программа зависит от этого сервиса. Поэтому без его остановки не закрывается. Как это обойти, не останавливая сервис, если это возможно?
0
453 / 177 / 31
Регистрация: 04.08.2018
Сообщений: 713
03.11.2025, 19:52
Elijah Tomcat, я правильно понимаю, что вы вот так вызываете эту вторую программу?
Delphi
54
if ShellExecute(0, 'open', 'ElDatabase.exe', nil, nil, SW_SHOW) > 32 then begin
Вам в первом ответе уже писали какая команда запускает процесс на выполнение. ShellExecute не предназначена для этого. https://www.gunsmoker.ru/2015/... uteEx.html
1
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,358
Записей в блоге: 3
04.11.2025, 10:51
У Вас, смотрю, подключен модуль Forms, поэтому вместо Close попробуйте:
Delphi
1
2
3
4
5
if ClientsNum = 0 then begin
   ClientSocket.Active := false;
   ServerSocket.Socket.Close;
   Application.Terminate;
end;
1
-16 / 2 / 0
Регистрация: 21.10.2023
Сообщений: 103
06.11.2025, 13:07  [ТС]
Спасибо всем! Решил проблему. Правильно расставил обращение к портам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2025, 13:07
Помогаю со студенческими работами здесь

Закрытие процесса Excel
Здравствуйте. Такая проблемка... У меня в работе берутся данные из файла Excel и заносятся в...

Закрытие формы без сохранения процесса выполнения
Получается так, что при нажатии на кнопку в form6 закрываются все остальные формы, кроме form1. В...

Закрытие стороннего процесса
Всем привет. У меня возникла проблема мне нужно закрыть сторонний процесс.Пока я понял только как...

Закрытие формы без сохранения процесса выполнения и обнуление переменной оператора case
Всем доброго времени суток. Я делаю приложение с тестами. Ситуация: допустим я решаю тест до...

Запрет на закрытие программы.
Подскажите, пожалуйста. Как сделать так, чтобы при нажатие на крестик в правом верхнем углу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru