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

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

02.11.2025, 21:46. Показов 910. Ответов 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
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
03.11.2025, 08:26
Не видя Вашего кода ничего предметно сказать нельзя, но судя по Вашим словам:
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
Программа по какому-либо условию закрывается методом Close.
Цитата Сообщение от Elijah Tomcat Посмотреть сообщение
и висит в дереве процессов до закрытия сервиса.
появляется подозрение, что "программа" - это не программа, а форма приложения.
Оформите свою "программу" именно как приложение Windows и запускайте ее при помощи CreeateProcess()

Более предметно и более подробно - только при условии показа Вашего кода.
0
-16 / 2 / 0
Регистрация: 21.10.2023
Сообщений: 107
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
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
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
Сообщений: 107
03.11.2025, 14:57  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
if ClientsNum = 0 then Close;
Так я тоже писал, результат тот же.
Я так понимаю, что сервис, работая в нулевом кольце, запускает программу тоже в нулевом кольце, поэтому форма программы не отображается (меня это устраивает). Но каким-то образом запущенная программа зависит от этого сервиса. Поэтому без его остановки не закрывается. Как это обойти, не останавливая сервис, если это возможно?
0
453 / 177 / 31
Регистрация: 04.08.2018
Сообщений: 717
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
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 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
Сообщений: 107
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru