powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как программно закрыть приложение?
25 сообщений из 37, страница 1 из 2
Как программно закрыть приложение?
    #37938021
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сори за детский вопрос - как программно закрыть приложение из дельфи?
Мы запускали его не из дельфи, и никаких данных о нем (заголовок окна и прочее) - не знаем. Знаем тока путь к исполняемому файлу.
Нашел вот такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function KillTask(ExeFileName: string): integer;
const PROCESS_TERMINATE=$0001;
var ContinueLoop: BOOL;
     FSnapshotHandle: THandle;
     FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while integer(ContinueLoop)<> 0 do
   begin

    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
       (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
     Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);end;
     CloseHandle(FSnapshotHandle); 
end;



Но чото как то он у меня не работает, возможно потому что у меня Windows 7.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37938024
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, вот решение
SendMessage(FindWindow('ConsoleWindowClass', nil), WM_CLOSE, 0, 0);
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37938048
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DebusenВсем спасибо, вот решение
SendMessage( FindWindow ('ConsoleWindowClass', nil), WM_CLOSE, 0, 0);теперь запустите четыре таких приложения ('ConsoleWindowClass') и закройте только второе.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37938056
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особенно "порадовало"
Код: pascal
1.
2.
3.
function KillTask(ExeFileName: string): integer;
...
Result := Integer(TerminateProcess(...

Ведь черным по белому написано

Debusen, обратите внимание на Синтаксис и Замечания TerminateProcess vs ExitProcess
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940562
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GatorОсобенно "порадовало"
Код: pascal
1.
2.
3.
function KillTask(ExeFileName: string): integer;
...
Result := Integer(TerminateProcess(...

Ведь черным по белому написано

Debusen, обратите внимание на Синтаксис и Замечания TerminateProcess vs ExitProcess

Да, лучше конечно закрывать именно по хэндлу. Но как узнать хэндл? Особенно учитывая что у меня запускается командная строка, из которой запускается еще одно приложение, которое тоже желательно закрыть. Открываем вот так.
Код: pascal
1.
2.
3.
4.
DpiS:=IntToStr(Dpi);
Str:='/k '+'i_view32.exe '+f+' /dpi=('+DpiS+','+DpiS+') /convert='+f;
Pan:=PAnsiChar(Str);
ShellExecute(0,'open','cmd.exe',Pan,'C:\Windows\system32\',SW_SHOW);



И чтобы два раза не вставать - я запускаю командную строку. В ней отрабатывает какое то приложение, после чего нужно его закрыть. Как узнать, что приложение отработало и cmd.exe уже можно закрыть?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940597
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По первому вопросу выяснил, что вроде как раз ShellExecute и возвращает хэндл.
Почему тогда не работает вот этот кусок кода?
Код: pascal
1.
2.
3.
4.
5.
HD:=ShellExecute(Handle,'open','cmd.exe',Pan,'C:\Windows\system32\',SW_SHOW);
...
GetWindowThreadProcessId(HD,PID);
hProc:=OpenProcess(PROCESS_TERMINATE,true,PID);
TerminateProcess(hProc,0);



В процессе выполнения GetWindowThreadProcessId(HD,PID) - PID оказывается равен нулю.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940613
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DebusenПо первому вопросу выяснил, что вроде как раз ShellExecute и возвращает хэндл.И давно это стало происходить?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940616
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_DebusenПо первому вопросу выяснил, что вроде как раз ShellExecute и возвращает хэндл.И давно это стало происходить?
Ну на одном из форумов прочитал. Видимо ошиблись...
Так как же всё таки определить handle, чтобы корректно закрывать это несчастное окно?
А то программа должна запускаться из батника, который сам в командной строке выполняется, и скорее всего в процессе выполнения может закрыть и сам батник...
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940619
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, уже горячо...
Добрые люди подсказали, что надо использовать ShellxEcuteEx
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940629
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё, проблема решена через ShellExecuteEx. Одновременно решена проблема с ожиданием - пока не выполнено дочернее приложение дескриптор похоже не передается.
Всем спасибо.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940644
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тут разговор с самим собой получается, однако.
Вторая проблема не решена.
Нужно каким то образом узнавать что в cmd.exe отработало запущенное приложение и только после этого его закрывать.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940658
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Debusen> Нужно каким то образом узнавать что в cmd.exe отработало
Debusen> запущенное приложение и только после этого его закрывать.

А какая разница, в чём логика?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940671
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамDebusen> Нужно каким то образом узнавать что в cmd.exe отработало
Debusen> запущенное приложение и только после этого его закрывать.

А какая разница, в чём логика?


В каком смысле, в чем логика?
Для того, чтобы начать работать со следующим файлом мне нужно завершить обработку текущего. Файлов будет обрабатываться очень много, и просто недопустимо, чтобы программа начала работать со следующим файлом, не завершив работу с текущим.
Cmd.exe я исключил, и теперь запускаю сразу нужное приложение с нужными параметрами.
Поэтому формулировка вопроса сейчас звучит так: как, зная дескриптор процесса, узнать что он завершил работу? Возможно мне поможет яндекс...
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940673
Debusen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде всё.
WaitforSingleObject(SEInfo.hProcess, INFINITE)
Надеюсь больше у меня вопросов не возникнет.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940674
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Debusen> как, зная дескриптор процесса, узнать что он завершил работу?

Никак. Не нужно узнавать. Нужно просто дождаться.
Дождаться - WaitForSingleObject.

Debusen> Возможно мне поможет яндекс...

Так за чем дело стало?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #37940675
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, молодец, шустрый.

Debusen> WaitforSingleObject(SEInfo.hProcess, INFINITE)

Только не INFINITE, а циклический опрос по периоду.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как программно закрыть приложение?
    #39241127
Maxwellion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как закрыть приложение запущенное от имени другого пользователя.
На компьютере запущено приложение, которое иногда нужно закрыть, я всегда пользовался функцией приведённой в топике killtask и всё работало хоршо и красиво.
Но сейчас мне стало необходимо запускать приложение из моего же сервиса под системной учётной записью SYSTEM как мне сейчас закрыть приложение запущенное таким образом? killtask не помогает. Или в принципе не возможно закрыть приложение запущенное от имени другого пользователя?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241133
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxwellionНо сейчас мне стало необходимо запускать приложение из моего же сервиса под системной учётной записью SYSTEM как мне сейчас закрыть приложение запущенное таким образом?
Запускаемое приложение стороннее или самописное?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241137
Maxwellion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

всё самописное
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241145
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxwellionвсё самописное
Тогда всё просто: сообщаешь своему приложению любым способом, чтоб оно закрылось.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241160
Maxwellion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Я пробовал через SendMessage(FindWindow(nil, 'программа которую закрыть нужно'), WM_COPYDATA, Handle, Integer(@CDS)); но не получается, потому как программа которую нужно закрыть запущена сервисом, у которого отключена галочка "взаимодействие с рабочим столом" я так понимаю из-за этой галочки приложение не может получить команду или возможно потому, что опять же запущенно от имени другого пользователя
Читал что есть раздавать команды pipe и сокеты, ни тем ни другим не пользовался, поискал на эту тему больно мудрёно всё, нормальных рабочих примеров не нашёл, может есть более простые способы или понятные примеры?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241167
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxwellion,

а в том приложении, которое нужно закрыть, есть очередь сообщений?
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241176
Maxwellion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZeliusMaxwellion,

а в том приложении, которое нужно закрыть, есть очередь сообщений?

А что такое очередь сообщений?:) Если имеется ввиду procedure WMCopyData(var MessageData: TWMCopyData); то да, конечно имеется. Или вы про что-то другое?
Если запускать оба приложения от одного ползователя, то они вполне успешно обмениваются сообщениями указанным способом, но если от разных пользователей без взаимодействия с рабочим столом, то обмен сообщениями не работает.
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241280
Maxwellion,

А если в твоем приложении "которое нужно закрыть" повесить UDP/TCP клиента и открыть на прослушку "некий" порт, а из другого своего приложения ты будешь посылать команду на этот порт и твое первое приложение ее получит и сделает то что ты от него просишь. Это небольшая производная метода предложенного wadman'ом в 19205771
...
Рейтинг: 0 / 0
Как программно закрыть приложение?
    #39241306
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
семафор не знаю, будет ди доступен другому пользователю, но SharedFile точно можно использовать.
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как программно закрыть приложение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]