Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как программно закрыть приложение? / 25 сообщений из 37, страница 1 из 2
31.08.2012, 00:44:57
    #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
31.08.2012, 01:03:11
    #37938024
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
Всем спасибо, вот решение
SendMessage(FindWindow('ConsoleWindowClass', nil), WM_CLOSE, 0, 0);
...
Рейтинг: 0 / 0
31.08.2012, 02:05:27
    #37938048
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
DebusenВсем спасибо, вот решение
SendMessage( FindWindow ('ConsoleWindowClass', nil), WM_CLOSE, 0, 0);теперь запустите четыре таких приложения ('ConsoleWindowClass') и закройте только второе.
...
Рейтинг: 0 / 0
31.08.2012, 02:23:45
    #37938056
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
Особенно "порадовало"
Код: pascal
1.
2.
3.
function KillTask(ExeFileName: string): integer;
...
Result := Integer(TerminateProcess(...

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

Debusen, обратите внимание на Синтаксис и Замечания TerminateProcess vs ExitProcess
...
Рейтинг: 0 / 0
02.09.2012, 20:22:24
    #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
02.09.2012, 21:39:51
    #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
02.09.2012, 22:10:21
    #37940613
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
DebusenПо первому вопросу выяснил, что вроде как раз ShellExecute и возвращает хэндл.И давно это стало происходить?
...
Рейтинг: 0 / 0
02.09.2012, 22:14:12
    #37940616
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
_Vasilisk_DebusenПо первому вопросу выяснил, что вроде как раз ShellExecute и возвращает хэндл.И давно это стало происходить?
Ну на одном из форумов прочитал. Видимо ошиблись...
Так как же всё таки определить handle, чтобы корректно закрывать это несчастное окно?
А то программа должна запускаться из батника, который сам в командной строке выполняется, и скорее всего в процессе выполнения может закрыть и сам батник...
...
Рейтинг: 0 / 0
02.09.2012, 22:27:37
    #37940619
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
Ага, уже горячо...
Добрые люди подсказали, что надо использовать ShellxEcuteEx
...
Рейтинг: 0 / 0
02.09.2012, 22:51:16
    #37940629
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
Всё, проблема решена через ShellExecuteEx. Одновременно решена проблема с ожиданием - пока не выполнено дочернее приложение дескриптор похоже не передается.
Всем спасибо.
...
Рейтинг: 0 / 0
02.09.2012, 23:18:06
    #37940644
Debusen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
У меня тут разговор с самим собой получается, однако.
Вторая проблема не решена.
Нужно каким то образом узнавать что в cmd.exe отработало запущенное приложение и только после этого его закрывать.
...
Рейтинг: 0 / 0
02.09.2012, 23:36:53
    #37940658
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как программно закрыть приложение?
Debusen> Нужно каким то образом узнавать что в cmd.exe отработало
Debusen> запущенное приложение и только после этого его закрывать.

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

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

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


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

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

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

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

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

Debusen> WaitforSingleObject(SEInfo.hProcess, INFINITE)

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

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

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

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

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

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

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

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


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