Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.10;
Скачать: CL | DM;

Вниз

ShellAPI   Найти похожие ветки 

 
Adolf   (2003-01-18 14:28) [0]

Здравствуйте!
Дано:
Edit1.text:="Калькулятор";

{Процедура, закрывает калькулятор:}
PostMessage(FindWindow(nil,pchar(edit1.text)),WM_QUIT,0,0);
-----------------------------------------------------------
Нужно закрыть не окно с caption "Калькулятор", а работающий Калькулятор с путем C:\windows\calc.exe.
-----------------------------------------------------------
Как закрыть приложение, зная путь к нему?
Или как получить caption окна открытой из проги программы?


 
neodiX ©   (2003-01-18 14:54) [1]

если ты запустил прогу из своей проги, то ты уже имешь его proccess ID, a по нему ты в любой момент можешь убить запущеную прогу (TerminateProccess)


 
Adolf   (2003-01-18 15:26) [2]

Ага...А поподробней, пжалста?


 
CJCrazy ©   (2003-01-18 16:17) [3]

кажется, подобная задача уже была решена где-то на этом сайте (я её даже находил). так что ищем... :)


 
neodiX ©   (2003-01-18 16:36) [4]

CJCrazy прав.
2 Adolf: функцией createproccess запускаешь калькулятор, функция возвращает handle процесса, когда надо закрыть калькулятор делаешь TerminateProccess, а параметр подставляя полученый handle


 
CjCrazy ©   (2003-01-18 21:42) [5]

если лень искать по сайту, то могу порыться у себя в архивах (может чего-нить найду)


 
Adolf   (2003-01-19 14:04) [6]

1)Адольф в гробу перевернется, если будет искать на ЭТОМ сайте ответ на эту задачу!
2)За "могу порыться" спасиба
3)Createprocess-это вроде другая история...
4)Дак как же это делать?


 
neodiX ©   (2003-01-19 14:35) [7]


> 4)Дак как же это делать?

да вот так:
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;

procedure TForm1.Button1Click(Sender: TObject);
begin
FillMemory( @si, sizeof( si ), 0 );
si.cb := sizeof( si );
Createprocess(nil,pchar("d:\winnt\system32\calc.exe"),nil,nil,false,
NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
terminateprocess(pi.hProcess,255);
end;


 
Юрий Зотов ©   (2003-01-19 14:59) [8]

1. В коде утечка ресурсов - не освобождены оба хэндла.
2. А если программа запущена не из своей?

В общем, так.
1. Получаете список процессов
2. В нем находите процесс нужной программы.
3. OpenProcess, TerminateProcess,
4. CloseHandle (для всех хэндлов).

Примеры были на сайте (ищите через какой-нибудь Яндех по слову CreateToolhelp32Snapshot). В статьях, вроде бы, тоже есть.

В п.3 вместо OpenProcess + TerminateProcess лучше вызвать EnumThreadWindows, определить хэндл главного окна и закрыть его посылкой WM_CLOSE.


 
neodiX ©   (2003-01-19 15:06) [9]

2 Юрий Зотов
Конечно вы правы, но Adolf требовал конкретного примера, вот я решил на скорую руку его написать. А про утечку ресурсов - это я просто сделал в OnFormDestroy и сюда не запостил, а остальное -это уже погружение в пояснения , что обозначает тот или иной параметр.

> 1. Получаете список процессов
> 2. В нем находите процесс нужной программы.
> 3. OpenProcess, TerminateProcess,
> 4. CloseHandle (для всех хэндлов).


я не думаю, что Adolf сдесь бы разобрался, так как он спрашивал реализовать createprocess...


 
Adolf   (2003-01-19 22:33) [10]

>Юрий Зотов
Список процессов--имеется!Я с энтим разобрался (... ...)
А определеная прога запускается с моей проги.
Идея в том, чтобы запустить файл с моей проги, получить путь к этому файлу (это все понятно!), по желанию "отменить запуск запущенной проги", ища ее по полученному после запуска пути...
----
>neodiX
Код ваш еще не пробовал, но "смотрится" нормально. Попробую. Спасибо.


 
Юрий Зотов ©   (2003-01-20 11:06) [11]

> Adolf (19.01.03 22:33)

TerminateProcess может привести к тому, что останутся неосвобожденные ресурсы, невыгруженные DLL, захваченные файлы и пр. Поэтому не думаю, что Вы на верном пути.


 
ADOLF   (2003-01-20 14:34) [12]

>neodiX
Код вроде сырой к сожалению ... ... ...


 
Jack128 ©   (2003-01-20 15:17) [13]

to Юрий Зотов непонятно как определить какое из окон возвращеных EnumThreadWindows главное?
Я не смог найти нужной функции...


 
Adolf   (2003-01-20 17:57) [14]

>Юрий Зотов
Дак вы ж вроде сами говорили про получение списка, terminate Process?
Или я ошибся?
Или вы изменили мысль?

З.Ы. А если что-нить зависло? Удобно :
прога зависла-вызвал завершалку-завершил зависшую. Идея уже освещалась в кладовке, я ее - по своему. Alt-Ctrl...-задачу долго завершает (у меня по крайней мере). Terminate-сразу. Какая разница выгружен ли dll если зависшая мешает работе? Завершил работу, перегрузил.
Этот Terminate Process - вообще по-моему иная тема. Мне то нандо определять и закрывать прогу, запущенную из моей проги.

WM_CLOSE - это не звучит.


 
Jack128 ©   (2003-01-21 21:36) [15]

>> Adolf

Terminate Process - "некоректно" завершает прогу
при этом происходит утечка ресурсов(я понял так)

Если прога зависла то её нужно завершить именно с помощью Terminate Process,
но если прога не весит а ее нужно закрыть,
то нужно послать WM_CLOSE главному окну

alt - ctrl - del вначало посылает WM_CLOSE,
если прога в течении некоторого времени не отвечает
то винда закрывает прогу с помощью Terminate Process

ещё раз повторю вопрос :

как определить какое из окон возвращеных EnumThreadWindows главное?


 
Юрий Зотов ©   (2003-01-22 00:35) [16]

Можно и не определять, а просто в callback-функции закрывать все подряд. Еще вариант - не перебирать окна, а просто в каждый поток процесса послать WM_QUIT через PostThreadMessage. Еще вариант - найти и закрыть окно приложения на таскбаре, послав ему WM_SYSCOMMAND.


 
Jack128 ©   (2003-01-22 09:00) [17]

>Можно и не определять, а просто в callback-функции закрывать >все подряд

До этого ворианта я, слава богу, додумался :-)



Страницы: 1 вся ветка

Текущий архив: 2003.03.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
4-30180
AlexandrRya
2003-01-19 23:37
2003.03.10
Рисуем Bitmap


3-29732
Max79
2003-02-19 11:20
2003.03.10
Хотелось бы реализовать сортировку по возрастанию и убыванию


3-29773
sandrina
2003-02-19 12:35
2003.03.10
Oracle+Delphi


3-29772
Dgs
2003-02-18 18:33
2003.03.10
EDBEngineError: Capability not supported


4-30196
mate
2003-01-20 09:00
2003.03.10
Create.Application