Страница 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. Но вряд ли получится это сделать полноценно.