![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректно закрыть процесс [D5, D7, WinME, WinXP]
Керик © (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)
> Может есть какой-нибудь выход из положения?
нету.