Autorun

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Это не есть правильный подход, когда надо убивать сотню процессов. Тем более, для этого можно использовать другие средства.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV
Меня устроит.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET
Закрытие дерева сделал. Но поможет ли это - не знаю. Протестировал на Camper, его значок у меня остается и при закрытии дерева плагином, и при помощи taskkill /T.

1.4.9.3 beta
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
Не помогло. На Camper не стоит тестировать, очень кривая программка к сожалению (не в обиду D1P). А вот TCamper отлично уничтожается через taskkill /T, по-экспериментируйте на нём. Судя по тестам, получается сейчас ваш ключ /TT не есть аналог taskkill /T...
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET
Было бы что тестировать... Ключ делает то, что можно почерпнуть из описания соответствующего ключа taskkill: "Завершение указанного процесса и всех его дочерних процессов". Возможно, он не повторяет полностью его внутреннюю реализацию.

Я рекурсивно прохожу по процессам, проверяя принадлежность каждого к родительскому процессу. Даже не знаю, что тут можно еще выдумать.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
Я в программировании ноль, кроме тестирования ничем помочь не могу.

Вот например у известной консольной утилитки nircmdc есть два похожих параметра:
closeprocess
killprocess
Первый из них корректно завершает процесс и иконка из трея исчезает
Второй убивает процесс, в трее иконка остаётся.

Вот по этой аналогии хочется, что бы ваш плагин умел завершать процесс, а не убивать его.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET писал(а):Вот например у известной консольной утилитки nircmdc есть два похожих параметра:

closeprocess
killprocess

Первый из них корректно завершает процесс и иконка из трея исчезает

Второй убивает процесс, в трее иконка остаётся.
Ну, собственно, тут всё логично. Я уже писал, что можно попытаться закрыть процесс корректно с помощью сообщения окну, что closeprocess и делает. Можно добавить такой код, но тут встают некоторые проблемы.

Во-первых, у приложения может быть несколько форм. Если в обычных можно найти ту, у которой нет родителя, то у программ на дельфи сложно надежно определить, какая форма "главная". Можно попытаться посылать сообщения всем подряд, но не знаю, во что это может вылиться.

Во-вторых, окно в силу разных обстоятельств может не отреагировать на сообщение закрытия, или отреагировать с большой задержкой. Чтобы не зависнуть навечно, придется вводить некий таймаут. Если окно не закроется за время таймаута, придется его убить, и иконка опять может остаться. При этом, если таких приложений окажется несколько, закрытие тотала может затянуться.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
Вы ввели два параметра для закрытия - T и TT, так пусть один убивает, а другой пытается закрыть. А пользователь сам выберет, что предпочтительнее с конкретной программой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET писал(а):Вы ввели два параметра для закрытия - T и TT, так пусть один убивает, а другой пытается закрыть. А пользователь сам выберет, что предпочтительнее с конкретной программой.
Нет, второй уже закрывает дерево, что тоже может быть полезным. Тогда уж лучше ввести дополнительный параметр, сообщающий, что нужно попробовать закрыть окна. Разумеется, в этом случае могут быть задержки.

Например, так:
/W - пробовать закрыть окна. Стандартный таймаут 1000 мс.
/W1234 - то же самое, но с произвольно заданным таймаутом.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
отлично, буду ждать решения.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Ну вот, сейчас вроде всё как ожидалось работает (/TT /W). Правда, тестировал только на Camper - единственном, с чем у меня наблюдались проблемы.

1.4.9.3 beta
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение 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), значёк остаётся, а вторая завершается и значка нет.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

HA3APET
AUTOFx это что? Дай ссылочку, потестирую.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Loopback
AUTOFx - после запуска, можно будет в TC вызывать программу-редактор или просмотрщик удерживая левую кнопку мыши на файле, переключаться между F3 и F4 по средней кн мыши.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Какая-то бредовая ситуация получается :? Почему-то PID процесса, который получаю из члена hProcess структуры, передаваемой в ShellExecuteEx, получается не такой, который виден в диспетчере задач. Пробовал аж тремя различными способами. При этом hProcess однозначно правильный - процессы на выходе по нему убиваются.

Если запускать процесс с помощью CreateProcess, PID получается правильный. Но в этом случае теряется возможность запустить документ.

В чем дело неясно совершенно. В общем, если решение проблемы не найдется, придется эмулировать работу с документами с помощью FindExecutable или AssocQueryString. Но вряд ли получится это сделать полноценно.
Ответить