Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизКорректно закрыть процесс Найти похожие ветки
← →
Керик (2006-12-02 18:12) [0]Из своей проги можно ЗАПУСТИТЬ любую внешнюю программу. А можно ли внешнюю программу, запущенную из своей проги, КОРРЕКТНО ЗАКРЫТЬ? Можно убить процесс, но мне не это нужно.
← →
Dmitrij_K (2006-12-02 18:13) [1]Корректно программа убиться может только сама.
← →
Eraser © (2006-12-02 18:22) [2]> [0] Керик (02.12.06 18:12)
если есть окна - попробовать послать им WM_CLOSE.
← →
Керик (2006-12-03 11:47) [3]Если послать главному окну WM_CLOSE, то это не будет всегда работать правильно. Например, если у программы открыты диалоговые окна или она просто не реагирует на это сообщение по другим причинам.
Может есть какой-нибудь выход из положения?
← →
Eraser © (2006-12-03 14:13) [4]> [3] Керик (03.12.06 11:47)
> Может есть какой-нибудь выход из положения?
нету.
← →
Керик (2006-12-03 14:29) [5]Один хороший человек (программирует на 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:36) [6]> [5] Керик (03.12.06 14:29)
> Один хороший человек (программирует на C++) подсказал, что
> смысл в следующем:
> ищешь команду на дельфи, которая запускает приложение (программу)
> программной строкой.
и что?
какое отношение это имеет к сабжу?
← →
Керик (2006-12-03 15:07) [7]Меня интересует не закрытие любой внешней программы, а той, которая запущена из моей проги!
К сабжу это имеет прямое отношение: это и есть то, что нужно писать вместо program.exe
← →
oxffff © (2006-12-03 15:11) [8]
> Керик (03.12.06 14:29) [5]
> Один хороший человек (программирует на C++) подсказал, что
> смысл в следующем:
> ищешь команду на дельфи, которая запускает приложение (программу)
> программной строкой.
> В C++ их вообще чуть ли не с 10 функций делающих это.
> На старом бэйсике эта функция вообще SHELL называлась.
> А там просто пишешь команду
> TaskKill /IM program.exe
> где program.exe - имя файла программы которую нужно закрыть.
>
> Если внешних программ несколько, то лучше полный путь к
> программе прописать.
А что taskKill КОРРЕКТНО ЗАКРЫТЬ процесс может?
Что то название сомнительное.
Да и кстати даже Microsoft не может корректно закрыть задачу, если она повисла (поток на котором висит Getmessage).
А там пишут на с++.
Как вариант нажать RESET. И для гарантии выдернуть из розетки.
← →
oxffff © (2006-12-03 15:15) [9]А что TerminateProcess?
The TerminateProcess function terminates the specified process and all of its threads.
← →
Керик (2006-12-03 15:16) [10]Оказалось, что в WinXP Home Edition нет файла taskkill.exe.
Сейчас его добавлю в System32 и попробую.
← →
oxffff © (2006-12-03 15:17) [11]Создаешь с помощью CreateProcess
в LPPROCESS_INFORMATION есть hаndle.
И используешь его в TerminateProcess.
← →
Керик (2006-12-03 15:20) [12]TerminateProcess - это и есть убивалка процессов, но мне это не нужно.
← →
oxffff © (2006-12-03 15:24) [13]Открой секцию импорта у taskKill и посмотри импортируемые функции.
Там есть TerminateProcess.
← →
Керик (2006-12-03 15:28) [14]Похоже, что работает!
← →
oxffff © (2006-12-03 15:29) [15]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:37) [16]Проверил:
WinExec("TaskKill /IM winamp.exe", SW_HIDE);
WinExec("TaskKill /IM "C:\Program Files\Winamp\winamp.exe"", SW_HIDE);
Работает.
Тему можно считать закрытой. Всем спасибо!
← →
Eraser © (2006-12-03 15:40) [17]мдя...
← →
Керик (2006-12-03 15:41) [18]Для oxffff ©:
Это не значит, что все процессы taskkill убивает этой функцией. Из твоего сообщения видно, что используется TerminateProcess в зависимости от параметров. Например, использует при параметре /F
при параметре /IM taskkill не TerminateProcess использует
← →
Eraser © (2006-12-03 15:43) [19]> [18] Керик (03.12.06 15:41)
угу, оно использует WM_CLOSE...
← →
Керик (2006-12-03 15:50) [20]Для Eraser ©:
Согласен.
← →
oxffff © (2006-12-03 17:18) [21]А еще есть WM_QUIT.
← →
Leonid Troyanovsky © (2006-12-03 18:09) [22]
> Керик (03.12.06 15:50) [20]
> Для Eraser ©:
> Согласен.
Тогда, будь любезен, определение корректности - в студию.
--
Regards, LVT.
← →
Eraser © (2006-12-03 18:11) [23]> [21] oxffff © (03.12.06 17:18)
кстати да!
только если его слать всем подряд потокам приложения - можно получить, мягко говоря, непредсказуемый результат в некоторых приложениях.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c