Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректно закрыть процесс [D5, D7, WinME, WinXP]


Страницы:   1 2

Керик ©   (2006-12-02 18:12:00) 

Из своей проги можно ЗАПУСТИТЬ любую внешнюю программу. А можно ли внешнюю программу, запущенную из своей проги, КОРРЕКТНО ЗАКРЫТЬ? Можно убить процесс, но мне не это нужно.


Eraser   (2006-12-03 18:11:00) [1]

> [21] oxffff ©   (03.12.06 17:18)

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


Leonid Troyanovsky   (2006-12-03 18:09:00) [2]


> Керик   (03.12.06 15:50) [20]
> Для Eraser ©:
> Согласен.

Тогда, будь любезен, определение корректности - в студию.

--
Regards, LVT.


oxffff   (2006-12-03 17:18:00) [3]

А еще есть WM_QUIT.


Керик   (2006-12-03 15:50:00) [4]

Для Eraser ©:
Согласен.


Eraser   (2006-12-03 15:43:00) [5]

> [18] Керик   (03.12.06 15:41)

угу, оно использует WM_CLOSE...


Керик   (2006-12-03 15:41:00) [6]

Для oxffff ©:
Это не значит, что все процессы taskkill убивает этой функцией. Из твоего сообщения видно, что используется TerminateProcess в зависимости от параметров. Например, использует при параметре /F

при параметре /IM taskkill не TerminateProcess использует


Eraser   (2006-12-03 15:40:00) [7]

мдя...


Керик   (2006-12-03 15:37:00) [8]

Проверил:
WinExec('TaskKill /IM winamp.exe', SW_HIDE);
WinExec('TaskKill /IM "C:\Program Files\Winamp\winamp.exe"', SW_HIDE);

Работает.
Тему можно считать закрытой. Всем спасибо!


oxffff   (2006-12-03 15:29:00) [9]

If you know the name of a process to kill, for example notepad.exe, use the following command from a command prompt to end it:

taskkill /IM notepad.exe

This will cause the program to terminate gracefully, asking for confirmation if there are unsaved changes. To forcefully kill the same process, add the /F option to the command line. Be careful with the /F option as it will terminate all matching processes without confirmation.

To kill a single instance of a process, specify its process id (PID). For example, if the desired process has a PID of 827, use the following command to kill it:

taskkill /PID 827

Using filters, a variety of different patterns can be used to specify the processes to kill. For example, the following filter syntax will forcefully kill all processes owned by the user Quinn:

Ключ /F как раз и использует terminateProcess.


Керик   (2006-12-03 15:28:00) [10]

Похоже, что работает!


oxffff   (2006-12-03 15:24:00) [11]

Открой секцию импорта у taskKill и посмотри импортируемые функции.
Там есть TerminateProcess.


Керик   (2006-12-03 15:20:00) [12]

TerminateProcess - это и есть убивалка процессов, но мне это не нужно.


oxffff   (2006-12-03 15:17:00) [13]

Создаешь с помощью CreateProcess
в LPPROCESS_INFORMATION есть hаndle.
И используешь его в TerminateProcess.


Керик   (2006-12-03 15:16:00) [14]

Оказалось, что в WinXP Home Edition нет файла taskkill.exe.
Сейчас его добавлю в System32 и попробую.


oxffff   (2006-12-03 15:15:00) [15]

А что TerminateProcess?

The TerminateProcess function terminates the specified process and all of its threads.


oxffff   (2006-12-03 15:11:00) [16]


> Керик   (03.12.06 14:29) [5]
> Один хороший человек (программирует на C++) подсказал, что
> смысл в следующем:
> ищешь команду на дельфи, которая запускает приложение (программу)
> программной строкой.
> В C++ их вообще чуть ли не с 10 функций делающих это.
> На старом бэйсике эта функция вообще SHELL называлась.
> А там просто пишешь команду
> TaskKill /IM program.exe
> где program.exe - имя файла программы которую нужно закрыть.
>
> Если внешних программ несколько, то лучше полный путь к
> программе прописать.


А что taskKill КОРРЕКТНО ЗАКРЫТЬ процесс может?
Что то название сомнительное.

Да и кстати даже Microsoft не может корректно закрыть задачу, если она повисла (поток на котором висит Getmessage).
А там пишут на с++.

Как вариант нажать RESET. И для гарантии выдернуть из розетки.


Керик   (2006-12-03 15:07:00) [17]

Меня интересует не закрытие любой внешней программы, а той, которая запущена из моей проги!
К сабжу это имеет прямое отношение: это и есть то, что нужно писать вместо program.exe


Eraser   (2006-12-03 14:36:00) [18]

> [5] Керик   (03.12.06 14:29)


> Один хороший человек (программирует на C++) подсказал, что
> смысл в следующем:
> ищешь команду на дельфи, которая запускает приложение (программу)
> программной строкой.

и что?
какое отношение это имеет к сабжу?


Керик   (2006-12-03 14:29:00) [19]

Один хороший человек (программирует на C++) подсказал, что смысл в следующем:
ищешь команду на дельфи, которая запускает приложение (программу) программной строкой.
В C++ их вообще чуть ли не с 10 функций делающих это.
На старом бэйсике эта функция вообще SHELL называлась.
А там просто пишешь команду
TaskKill /IM program.exe
где program.exe - имя файла программы которую нужно закрыть.
Если внешних программ несколько, то лучше полный путь к программе прописать.

Я не разбираюсь в C++. Попробовал так:

WinExec('TaskKill /IM winamp.exe', SW_HIDE);
WinExec('TaskKill /IM "C:\Program Files\Winamp\winamp.exe"', SW_HIDE);

Когда винамп был запущен, я и то и другое пробовал. В ответ - ничего не происходит. Может есть какие-то предложения?


Eraser   (2006-12-03 14:13:00) [20]

> [3] Керик   (03.12.06 11:47)


> Может есть какой-нибудь выход из положения?

нету.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо