Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.055 c
15-1168255147
i-am-vladko
2007-01-08 14:19
2007.01.28
Статья "Написание оптимального кода под Delphi"


15-1168025419
Галинка
2007-01-05 22:30
2007.01.28
Ищу ветку


3-1163062331
novill
2006-11-09 11:52
2007.01.28
IB 7.5 Как в триггере изнать сколько записей вернул подзапрос?


15-1168345518
vasIzmax
2007-01-09 15:25
2007.01.28
"Рукопись"


2-1168508653
term1t
2007-01-11 12:44
2007.01.28
то ли лыжи не едут...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский