Страница 15 из 243
Добавлено: Пт мар 11, 2011 15:17
MVV
Это не есть правильный подход, когда надо убивать сотню процессов. Тем более, для этого можно использовать другие средства.
Добавлено: Пт мар 11, 2011 15:21
Flasher
MVV
Меня устроит.
Добавлено: Чт мар 17, 2011 11:54
Loopback
HA3APET
Закрытие дерева сделал. Но поможет ли это - не знаю. Протестировал на Camper, его значок у меня остается и при закрытии дерева плагином, и при помощи taskkill /T.
1.4.9.3 beta
Добавлено: Сб мар 19, 2011 18:23
HA3APET
Loopback
Не помогло. На Camper не стоит тестировать, очень кривая программка к сожалению (не в обиду D1P). А вот
TCamper отлично уничтожается через taskkill /T, по-экспериментируйте на нём. Судя по тестам, получается сейчас ваш ключ /TT не есть аналог taskkill /T...
Добавлено: Сб мар 19, 2011 19:07
Loopback
HA3APET
Было бы что тестировать... Ключ делает то, что можно почерпнуть из описания соответствующего ключа taskkill: "Завершение указанного процесса и всех его дочерних процессов". Возможно, он не повторяет полностью его внутреннюю реализацию.
Я рекурсивно прохожу по процессам, проверяя принадлежность каждого к родительскому процессу. Даже не знаю, что тут можно еще выдумать.
Добавлено: Сб мар 19, 2011 19:20
HA3APET
Loopback
Я в программировании ноль, кроме тестирования ничем помочь не могу.
Вот например у известной консольной утилитки nircmdc есть два похожих параметра:
closeprocess
killprocess
Первый из них корректно завершает процесс и иконка из трея исчезает
Второй убивает процесс, в трее иконка остаётся.
Вот по этой аналогии хочется, что бы ваш плагин умел завершать процесс, а не убивать его.
Добавлено: Сб мар 19, 2011 21:49
Loopback
HA3APET писал(а):Вот например у известной консольной утилитки nircmdc есть два похожих параметра:
closeprocess
killprocess
Первый из них корректно завершает процесс и иконка из трея исчезает
Второй убивает процесс, в трее иконка остаётся.
Ну, собственно, тут всё логично. Я уже писал, что можно попытаться закрыть процесс корректно с помощью сообщения окну, что closeprocess и делает. Можно добавить такой код, но тут встают некоторые проблемы.
Во-первых, у приложения может быть несколько форм. Если в обычных можно найти ту, у которой нет родителя, то у программ на дельфи сложно надежно определить, какая форма "главная". Можно попытаться посылать сообщения всем подряд, но не знаю, во что это может вылиться.
Во-вторых, окно в силу разных обстоятельств может не отреагировать на сообщение закрытия, или отреагировать с большой задержкой. Чтобы не зависнуть навечно, придется вводить некий таймаут. Если окно не закроется за время таймаута, придется его убить, и иконка опять может остаться. При этом, если таких приложений окажется несколько, закрытие тотала может затянуться.
Добавлено: Сб мар 19, 2011 22:10
HA3APET
Loopback
Вы ввели два параметра для закрытия - T и TT, так пусть один убивает, а другой пытается закрыть. А пользователь сам выберет, что предпочтительнее с конкретной программой.
Добавлено: Сб мар 19, 2011 22:23
Loopback
HA3APET писал(а):Вы ввели два параметра для закрытия - T и TT, так пусть один убивает, а другой пытается закрыть. А пользователь сам выберет, что предпочтительнее с конкретной программой.
Нет, второй уже закрывает дерево, что тоже может быть полезным. Тогда уж лучше ввести дополнительный параметр, сообщающий, что нужно попробовать закрыть окна. Разумеется, в этом случае могут быть задержки.
Например, так:
/W - пробовать закрыть окна. Стандартный таймаут 1000 мс.
/W1234 - то же самое, но с произвольно заданным таймаутом.
Добавлено: Сб мар 19, 2011 22:57
HA3APET
Loopback
отлично, буду ждать решения.
Добавлено: Вс мар 20, 2011 00:40
Loopback
Ну вот, сейчас вроде всё как ожидалось работает (/TT /W). Правда, тестировал только на Camper - единственном, с чем у меня наблюдались проблемы.
1.4.9.3 beta
Добавлено: Вс мар 20, 2011 01:50
HA3APET
Loopback
Да всё отлично, для одной программы.
Но если прописать 2 программы
Код: Выделить всё
ShellExec /TT /W "Camper.exe" "" "%commander_path%\Camper\"
ShellExec /TT /W "AUTOFx.exe" "" "%commander_path%\autofx\"
то первая убивается (Camper), а вторая завершается. Если поменять местами
Код: Выделить всё
ShellExec /TT /W "AUTOFx.exe" "" "%commander_path%\autofx\"
ShellExec /TT /W "Camper.exe" "" "%commander_path%\Camper\"
То опять первая убивается (AUTOFx), значёк остаётся, а вторая завершается и значка нет.
Добавлено: Вс мар 20, 2011 10:36
Loopback
HA3APET
AUTOFx это что? Дай ссылочку, потестирую.
Добавлено: Вс мар 20, 2011 15:53
HA3APET
Loopback
AUTOFx - после запуска, можно будет в TC вызывать программу-редактор или просмотрщик удерживая левую кнопку мыши на файле, переключаться между F3 и F4 по средней кн мыши.
Добавлено: Вс мар 20, 2011 18:28
Loopback
Какая-то бредовая ситуация получается

Почему-то PID процесса, который получаю из члена hProcess структуры, передаваемой в ShellExecuteEx, получается не такой, который виден в диспетчере задач. Пробовал аж тремя различными способами. При этом hProcess однозначно правильный - процессы на выходе по нему убиваются.
Если запускать процесс с помощью CreateProcess, PID получается правильный. Но в этом случае теряется возможность запустить документ.
В чем дело неясно совершенно. В общем, если решение проблемы не найдется, придется эмулировать работу с документами с помощью FindExecutable или AssocQueryString. Но вряд ли получится это сделать полноценно.