17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
1

Как корректно завершить чужое приложение?

19.11.2008, 01:08. Показов 6289. Ответов 13
Метки нет (Все метки)

Мне надо завершить чужое приложени, чтоб оно типо завершило свои действие сохранило то че надо. Я не имеею хандл это приложение а только имеб proceessID
TerminateProcess убивает сам прочесс не давая ему нормально завкончить работу!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2008, 01:08
Ответы с готовыми решениями:

Внедрение dll в чужое приложение
Господа решил освоить этот аспект и поэксперементировать . Значит создаю dll в ней одна функция...

Как завершить дочернее приложение если родительское было завершено?
Ситуация такая. Есть родительское приложение. Оно создаёт дочерний процесс, с которым общается...

При получении WM_ENDSESSION Windows не дает корректно завершить программу
Всем привет! В моем приложении есть скрытое окно, которое получает от винды сообщения, т.е. ui...

Как корректно завершить COM порт?
Здравствуйте. Пишу программу на С++ CLR для считывания с устройства пакетов данных. Но тут...

13
12 / 12 / 0
Регистрация: 08.10.2008
Сообщений: 105
19.11.2008, 02:09 2
Если это приложение, которое надо закрыть, не обрабатывает сообщений windows то корректно его закрыть из внешней программы не получистся. По этому, кстати, при закрытии консоли программы ms-dos из виндовс (нажатием на крестик) она и спрашивает "Завершить процесс ?"
Цитата Сообщение от Crazyman Посмотреть сообщение
Я не имеею хандл это приложение а только имеб proceessID
Хандл (дискриптор) может принадлежать окну, но не процессу, а вот окно в свою очередь уже принедлежит процессу с определенным PID'ом. Единственный способ, при котором можно надеятся на корректное закрытие программы - послать всем окнам, принадлежащим процессу, сообщение WM_CLOSE (или в крайнем случае вызвать DestroyWindow(hWnd)). Но это не гарнтия того, что программа закроется корректно, так как можно реализовать код приложения так, что закрыв все его окна оно по-прежнему будет работать. Нет способа гарантирующего корректное закрытие стороннего процесса, т.к. только его разработчик знает в каком случае это произойдет.
0
17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
19.11.2008, 02:37  [ТС] 3
А TerminateProcess не можеть послать чтото чтоб оно нармально завершилось, а не убилось(тупо убить!)

Добавлено через 3 минуты 40 секунд
Вот еще одна мысля появилась, а как чужому приложения послать сообщение, что типа windows завершает работу, чтоб типа это програ подумала что надо закрываться.
0
12 / 12 / 0
Регистрация: 08.10.2008
Сообщений: 105
19.11.2008, 03:01 4
Цитата Сообщение от Crazyman Посмотреть сообщение
А TerminateProcess не можеть послать чтото чтоб оно нармально завершилось, а не убилось(тупо убить!)
нет не может

Цитата Сообщение от Crazyman Посмотреть сообщение
Вот еще одна мысля появилась, а как чужому приложения послать сообщение, что типа windows завершает работу, чтоб типа это програ подумала что надо закрываться.
Это можно, но тут опят же все замыкается на сообщениях windows (WM_ENDSESSION) которые посылаются окнам.

Добавлено через 4 минуты 39 секунд
В винде все безоконные приложения (кроме драйверов и системных служб - у них другой интерфейс общения) выполняемые в пямяти в момент завершении работы виндовс считаются зависшими и система их просто убивает!

Добавлено через 5 минут 44 секунды
А в чем собственно проблема? 99% пограмм под винду обрабатывают сообщения и корректно закрываются при получении WM_CLOSE или WM_ENDSESSION.
0
17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
20.11.2008, 00:13  [ТС] 5
Собственно у меня нет хендла окна а имееться только proceessID.. и из этого следует как мне твой WM_CLOSE или WM_ENDSESSION послать проге ??? И видимо моя програ которую я пытался закрыть откноситься к 1 % ??
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
20.11.2008, 14:54 6
Так ведь кажется есть функция, которая возвращает HWND главного окна из ThreadID. Вспомнить бы...
0
Эксперт С++
2924 / 1273 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
20.11.2008, 15:06 7
GetWindowThreadProcessId.
Короче, перебираешь все окна верхнего уровня (EnumWindows), и, сравнивая известный тебе processID с тем, который вернет вышеупомянутая функция, находишь главное окно приложения-жертвы. Потом просто отправляешь ему сообщение WM_QUIT - вежливо просишь приложение завершить работу подобру-поздорову, а не то!...
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
20.11.2008, 15:21 8
Во, нашел EnumThreadWindows(). Т.е. из ProcessID сначала узнаем ThreadID и к нему применяем функцию.
0
Эксперт С++
2924 / 1273 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
20.11.2008, 15:41 9
Как быть в случае, если в процессе - несколько (много) потоков?
0
17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
22.11.2008, 02:36  [ТС] 10
есть такая вещь
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject); 
function EnumProc(Ah:hwnd;AForm:lParam):boolean;stdcall; 
begin 
SendMessage(Ah,WM_CLOSE,0,0); 
Result:=True; 
end; 
begin 
Eh:=FindWindow(nil,'Unit1.pas - јЗКВ±ѕ'); 
GetWindowThreadProcessId(Eh,@pid); 
EnumThreadWindows(pid,@EnumProc,0); 
 
 
end;
Для тех кто знает китайский может посмотреть тут http://www.286it.com/html/Prog... 33771.html
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
22.11.2008, 21:36 11
Нужно не из хендела окна узнать процесс и тред ид, а наоборот, из процесс ид узнать хендл главного окна.
0
17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
23.11.2008, 00:14  [ТС] 12
А как это сделать из процесса ид узнать хендл главного окна
0
Эксперт С++
2924 / 1273 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
23.11.2008, 00:48 13
20.11.2008, 15:06 - все описано, чего же еще?
Готовый отлаженный код, и еще - на блюдечке с голубой каемочкой? Тогда - сколько платите, сударь?
0
17 / 14 / 3
Регистрация: 16.09.2008
Сообщений: 335
24.11.2008, 00:48  [ТС] 14
Функцию хотяб скажи

Добавлено через 18 минут 59 секунд
Это что типа так чтоли, так с кого тербовать блюдичку с голубой каемочкой ???
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function EnumWindowsProc(Wnd: hWnd;param:LPARAM):BOOL; stdcall;
var
ProcessID: DWORD;
begin
 
if (IsWindow(Wnd)) then begin
GetWindowThreadProcessId(wnd, processID);
if (GetCurrentProcessId=ProcessID) then 
begin
  // код....
end;
end;
result:=true;
end;
 
EnumWindows(@EnumWindowsProc, 0);
Добавлено через 23 часа 39 минут 2 секунды
Чето всеромно эта вышеуказаный код не работает. Ловит не те окна , ато че надо не находит !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2008, 00:48
Помогаю со студенческими работами здесь

Как корректно завершить поток
Написал программу-терминал для работы с последовательным портом с учетом нашей специфики работы....

Как корректно завершить вывод отчета в Excel?
Подскажите, как корректно завершить вывод отчета в Excel? Я объявляю новый объект, открываю лист,...

Сокеты и QThread - как корректно завершить поток
Пишу клиент с использованием QTcpSocket. Вынес разбор принимаемых сообщений в отдельный поток, но...

Как из одной программы корректно завершить другую?
Добрый день! Возникла проблема: одна программа запускает другую, а когда завершает свою работу...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru