View previous topic :: View next topic |
Author |
Message |
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Thu Apr 22, 2010 16:06 Post subject: Autorun |
|
|
Проект начинался с небольшого плагина MoveButton, позволявшего переместить кнопку опций в диалоге копирования. Затем возникла идея получить возможность выполнять некоторые дополнительные действия при запуске Total Commander: запускать приложения и отправлять команды. В результате появился Autorun. Изначально его даже не планировалось развивать, однако постепенно он обрастал всё новыми и новыми функциями и сейчас может делать множество полезных действий:
- Запускать файлы
- Устанавливать переменные окружения
- Выполнять внутренние команды Total Commander (cm_ и em_)
- Чтение и запись ini-файлов
- Чтение и запись реестра
- Задать задержку между выполнением команд
- Загрузка dll и подключение плагинов
- Выполнение набора действий при выходе из Total Commander
Подробнее можно прочитать в онлайн-справке или справке из дистрибутива.
Скачать на Wincmd.ru
Список доступных плагинов и библиотек
Включенные в дистрибутив
ModifyDialogs (бывший MoveButton)
Предназначен для небольших косметических изменений вида диалогов Total Commander. Можно производить следующие действия: перемещение и изменение размеров самого диалога, перемещение и изменение размеров элементов управления диалога, центрирование диалогов относительно главного или родительского окна, сохранение и загрузку позиций и размеров окна.
Process
Различные функции для работы с процессами: проверка существования процесса, завершение процессов, число процессов, получение вывода процесса.
Sysinfo
Дополнительные функции для получения системной информации: системных метрик и цветов, информации о процессоре, выполнение WMI-запросов.
Tweaks
Плагин включает некоторые дополнения для работы с интерфейсом Total Commander: назначение действий на нажатие кнопок мыши (и вращение колеса) для различных элементов главного окна TC (в том числе отображение своих контекстных меню на основе *.mnu или *.bar файлов), установка заданных элементов главного меню в неактивное состояние.
От других авторов
TCFS2Tools (Автор - MVV)
Позволяет управлять главным меню окна ТК:
- скрывать/отображать строку главного меню
- временно отображать главное меню программы при вызове
- отображать главное меню в виде всплывающего по команде пользователя
- получать/устанавливать позицию разделителя файловых панелей
- получать системные величины, возвращаемые функцией GetSystemMetrics
- получать размеры рабочей области экрана
ScrollTC (история версий, автор - GreIVI) (доступен только в 32-битной версии)
Дает возможность при наведении указателя мыши прокручивать колесиком в любом из отображаемых на экране окон приложений любой активный/неактивный компонент с полосой прокрутки.
Last edited by Loopback on Sat May 30, 2020 23:53; edited 9 times in total |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2622
|
(Separately) Posted: Thu Apr 22, 2010 17:40 Post subject: |
|
|
Loopback wrote: | Кому понравится - пользуйтесь |
Установил вместо Movebutton. Попробовал на скорую руку все типы команд.
Работает, спасибо! |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Thu Apr 22, 2010 18:01 Post subject: |
|
|
Quote: | Его значение всегда устанавливается в -1, так что выражение сравнения составляйте так, чтобы результат всегда был False (=0, >0, >-1, <>-1 и т.д.), иначе все файлы будут раскрашены . |
А не проще возвращать не число -1, а тупо в функции ContentGetValue возвращать значение ft_nosuchfield? Тогда независимо от возвращенного значения никакой оператор сравнения не будет работать - и раскраски не будет.
А так вроде прикольно, нужные действия можно сделать. И переменные окружения задаваться будут в окружении ТК.
И размерчик наш - не несколько сотен кило. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Thu Apr 22, 2010 20:22 Post subject: |
|
|
Quote: | А не проще возвращать не число -1, а тупо в функции ContentGetValue возвращать значение ft_nosuchfield? |
Хм, надо попробовать, что-то я ft_nosuchfield упустил.
Quote: | И размерчик наш - не несколько сотен кило. |
Да я сам люблю мелкие программы. А при таком функционале использовать VCL - даже как-то неудобно |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Mon Apr 26, 2010 16:44 Post subject: |
|
|
Небольшое обновление плагина. По совету MVV переделал функцию ContentGetValue, теперь не имеет значения, с чем сравнивать результат поля. И добавил поддержку способов отображения окна для команд запуска (скрытый/свернутый/развернутый) - важная вещь, про которую как-то забыл.
Ссылка в первом посте. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Jun 04, 2010 12:13 Post subject: |
|
|
Тут вопрос возник.
В Readme-файле кто-то wrote: | ShellExec <имя файла> [<параметры> [<рабочая папка> [<отображение=1>]]] |
Вопрос вот в чем - как плагин узнает, где заканчиваются параметры и начинается рабочая папка? Логично предположить, что параметры, как и рабочую папку, надо брать в кавычки. Но тогда имеем следующий нюанс - получается, нельзя передавать как параметр строку, содержащую кавычки. Или можно?
Например, мне надо передать следующую строку как параметр:
Code: | /t"ку ка ре ку" /c"бла бла бла" /p"хренотень" |
И при этом указать рабочую папку "C:\Documents and Settings\All Users". Это реально?
Проблема в том, что открывающая кавычка неразличима с закрывающей, и понять, закрываем ли мы параметр, или указываем открывающую вложенную кавычку, невозможно. Пока я не додумался юзать фигурные скобки для задания вложенности скриптов в Virtual Panel, это было реальной проблемой.
Когда я писал AskParam, я тоже сталкивался с подобной проблемой, когда нужно было установить в предлагаемый текст строку с кавычками, для этого пришлось добавлять специальный символ ^, который заменяется на кавычку (и параметр для его переназначения при необходимости).
Здесь, кстати, возможен еще вариант эскейпинга символов. То есть, для указания кавычки внутри параметра использовать последовательность \". Здесь это возможно, потому что строка параметров задается в конфиге, а не передается от другой программы. При использовании этого приема строка вызова программы с вышеуказанными параметрами и рабочей папкой будет выглядеть следующим образом:
Code: | ShellExec что-то-там.exe "/t\"ку ка ре ку\" /c\"бла бла бла\" /p\"хренотень\"" "C:\Documents and Settings\All Users" |
_________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Jun 04, 2010 17:25 Post subject: |
|
|
Кстати, родилась еще одна идея, которая кому-то точно понравится.
Можно добавить команду LoadLibrary, которая будет загружать в память указанную библиотеку. Этого уже будет достаточно для того, чтобы появилась возможность писать плагины к плагину от такого плагина требуется лишь одна фукция DllMain, в которой он на DLL_PROCESS_ATTACH будет инициализировать и запускать себя, а на DLL_PROCESS_DETACH - финализировать. При загрузке такого плагина нужно лишь запомнить его дескриптор, чтобы при выгрузке Autorun выгрузить и плагин.
То есть, от твоего плагина требуется лишь объявить глобальный список дескрипторов (типа HMODULE) и при выполнении команды LoadLibrary вызывать функцию LoadLibrary для указанного имени файла, а результат помещать в список, если запуск успешен. При выгрузке плагина просто достаешь все элементы списка и вызываешь для них FreeLibrary. Элементарно.
Как первый пример плагина для плагина я вижу библиотечку, которая будет позволять отображать и скрывать в рантайме меню окна тотала, при этом еще и показывать это меню по хоткею (или кнопке панели инструментов). Идея родилась при обдумывании сокрытия меню в TCFS2 (из стороннего приложения обнулять дескриптор меню - не очень хорошая мысль). _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Fri Jun 04, 2010 23:10 Post subject: |
|
|
MVV wrote: | Например, мне надо передать следующую строку как параметр:
И при этом указать рабочую папку "C:\Documents and Settings\All Users". Это реально?
|
Да, для этого есть возможность использовать одинарные кавычки. Парсер запоминает, с какой кавычки начинается параметр и кавычки другого типа считает вложенными. Смешанные кавычки использовать нельзя, это указано в ридми.
Про эскейп, разумеется, думал (либо про вариант, как сделано в Autoit - кавычки того же типа, как открывающие, внутри строки задваиваются), но решил всё не усложнять, поскольку это все же очень большая редкость, когда параметр содержит кавычки разных типов одновременно.
MVV wrote: | Кстати, родилась еще одна идея, которая кому-то точно понравится. |
Мне нравится Это с успехом позволит добавить автозагружаемый функционал без необходимостии добавлять новые цветовые схемы.
А в принципе, можно и вызовы пользовательских функций добавить. Плагин может вызывать некую заданную функцию для получения имен пользовательских функций, и далее, при обнаружении такой в файле конфигурации, вызывать ее и передавать ей параметры - в виде простой неразобранной строки или массива параметров-строк. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Sat Jun 05, 2010 08:49 Post subject: |
|
|
Quote: | Парсер запоминает, с какой кавычки начинается параметр и кавычки другого типа считает вложенными. |
Ой, этого я не заметил. Тогда мой бред про кавычки можно забыть.
Все мои случаи парсили стандартную строку параметров, где одинарные кавычки не приняты, поэтому приходилось извращаться. А если у тебя можно заключить строку в одинарные, и использовать в ней двойные - отлично. Кстати, можно добавить возможность вставки кавычки, с которой начинался параметр, указанием двух таких кавычек (например, в строке '/t"Символ ''a'':"' буква a будет обрамляться в одинарные кавычки).
Quote: | Это с успехом позволит добавить автозагружаемый функционал без необходимостии добавлять новые цветовые схемы. |
Так о чем и речь можно будет и твои мышиные команды в модуль выделить, чтобы авторан был чисто автораном.
Ну, я думал и про вызов функции без параметров из DLL. Правда, тут возникает вопрос - что делать после вызова функции - выгружать DLL или нет? Хотя, можно добавить параметр-флаг выгрузки модуля после вызова функции. Например, чтобы загрузить DLL, вызвать функцию и выгрузить DLL после завершения функции:
Code: | LoadLibrary /U myplugin.dll auto_func_1 |
Оставшиеся в памяти DLL помещаешь в список и выгружаешь при выгрузке своего плагина, а те, которые сразу - сразу после завершения функции. Кстати, можно добавить еще параметр - выполнять функцию из DLL в параллельном потоке, чтобы она не замораживала загрузку. При этом можно добавить еще один параметр - задержку загрузки, чтобы параллельный поток немного пододжал перед загрузкой DLL. Типо,
Code: | LoadLibrary [/U] [/T] [/D1000] <dll_name> [<func_name>] |
Все-таки я схожусь к мысли, что необязательные параметры типа добавления/замены текста переменной удобнее добавлять в начале параметров через слэш, так проще парсить, и потом, так число необязательных параметров может быть любым:
Code: | SetEnv [/A] <имя переменной> <текст переменной> |
_________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Sat Jun 05, 2010 09:53 Post subject: |
|
|
MVV wrote: | Кстати, можно добавить возможность вставки кавычки, с которой начинался параметр, указанием двух таких кавычек |
Ну я уже и писал, думал об этом, но пока решил не усложнять.
MVV wrote: | Ну, я думал и про вызов функции без параметров из DLL. Правда, тут возникает вопрос - что делать после вызова функции - выгружать DLL или нет? |
Ок, обдумаем.
MVV wrote: | Все-таки я схожусь к мысли, что необязательные параметры типа добавления/замены текста переменной удобнее добавлять в начале параметров через слэш, так проще парсить, и потом, так число необязательных параметров может быть любым: |
Для парсера в данном случае важен порядок параметров. Если возникнет необходимость множества необязательных параметров - можно будет подумать над изменением. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Sat Jun 05, 2010 22:50 Post subject: |
|
|
MVV wrote: | Я бы писал парсер строк отдельно, и отдельной функцией сам алгоритм обработки команды |
Так оно в принципе и есть, из функции обработки вызывается нужное число раз парсер, который каждый раз забирает из командной строки один параметр (наподобие стека), т.е. по-порядку. В случае введения именованных параметров, нужно будет дополнительно проверять, является ли параметр именованным, и если нет, дальнейшие параметры обрабатывать как раньше. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Mon Jun 14, 2010 19:46 Post subject: |
|
|
Ну вот, в первом приближении реализовал. Склоняюсь к мысли перейти для флажков к именованным параметрам, это будет следующий шаг.
Пока же добавил функцию "LoadLibrary", которая работает в двух режимах: просто загружает dll (c опциональным вызовом функции), либо инициализирует ее как плагин. Подробности в ридми.
Пока бета: Скачать |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Tue Jun 15, 2010 16:39 Post subject: |
|
|
Надеюсь, успею запостить, пока форум в очередной раз за сегодня не сдохнет...
LoadLibrary и вызов функции, а также выгрузка DLL (сразу или при выгрузке плагина) работают нормально.
А вот с Autorun_PluginInit какой-то косяк - вызывается она явно не как __stdcall, также я пробовал __fastcall и __cdecl, ни при одном из них я не нахожу в стеке этих параметров на нужном месте. Ерунда какая-то. Кстати, какой размер буфера - чему равна MaxListSize (может, хоть ее найду)?
Корректные прототипы функций:
Code: | void __stdcall Autorun_PluginInit(const AutorunInfo* Info, char* FuncList, int MaxListSize);
int __stdcall Autorun_ExecFunc(const char* FuncName, const char** Param, int ParamCount); |
(тип вызова указывается после типа возвращаемого значения, и с двумя символами подчеркивания)
И вопрос - что такое HModule nProcID? В Си нет такого типа, но есть тип HMODULE (регистр в Си важен). Но я вообще не въеду, что с этим хэндлом можно делать. Зачем он? Идентификаторы процесса и потока можно получить прямо из DLL, хэндл модуля загруженной библиотеки ей передается в DllMain, дескриптор окна ТК передается плагином (кстати, ты окно ищешь с учетом его принадлежности текущему процессу? ). Не представляю, какие еще могут понадобиться дескрипторы для работы. А если и могут, то DLL их по идее может получить так же точно, как и твой плагин.
Также плохо понятно (хотя смотрится интересно), зачем добавлять функции из DLL в список. Их потом можно прямо из конфига запускать? Потестить фичу по вышеизложенным причинам не удалось. В любом случае, Autorun-скрипт выполняется при запуске ТК, то есть, крайне малое время, так что смысл в возможности вызывать функции по именам видится слабо. Кстати, любую DLL можно загружать любое число раз - при этом система сама поймет, что DLL уже загружена, и просто передаст ей управление (вызовет DllMain с параметром DLL_THREAD_ATTACH) - я к тому, что можно написать LoadLibrary MyDll.dll MyFunc несколько раз - и DLL будет по-настоящему загружена лишь раз, а функция будет вызвана нужное число раз. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1385
|
(Separately) Posted: Tue Jun 15, 2010 23:47 Post subject: |
|
|
MVV wrote: | А вот с Autorun_PluginInit какой-то косяк - вызывается она явно не как __stdcall, также я пробовал __fastcall и __cdecl, ни при одном из них я не нахожу в стеке этих параметров на нужном месте. Ерунда какая-то. Кстати, какой размер буфера - чему равна MaxListSize (может, хоть ее найду)? |
Точно, косяк. Не объявил прототип вызывамой функции как stdcall. Перезалил, должно работать.
MVV wrote: | Корректные прототипы функций: |
Спасибо, делал по памяти, позабыл уже.
MVV wrote: | И вопрос - что такое HModule nProcID? В Си нет такого типа, но есть тип HMODULE (регистр в Си важен). Но я вообще не въеду, что с этим хэндлом можно делать. Зачем он? |
Согласен, передавать результат вызова одной стандартной функции - излишество Уберу.
MVV wrote: |
дескриптор окна ТК передается плагином (кстати, ты окно ищешь с учетом его принадлежности текущему процессу? ).
|
Конечно.
MVV wrote: |
Не представляю, какие еще могут понадобиться дескрипторы для работы. А если и могут, то DLL их по идее может получить так же точно, как и твой плагин. |
Могут, конечно, но почему бы не передать некоторые данные, поиск которых занимает некоторое время, но которые уже найдены?
Собственно идея была именно в этом. Если возникнут какие-нибудь мысли насчет такой информации - можно ее добавить в структуру.
MVV wrote: | Также плохо понятно (хотя смотрится интересно), зачем добавлять функции из DLL в список. Их потом можно прямо из конфига запускать? |
Это не "реальные" экспортируемые функции dll. Например, плагин сообщает, что он поддерживает некую функцию "MyFunc". Мы можем это имя использовать в скрипте, причем с неограниченным количеством параметров. Autorun парсит строку и вызывает из соответствующего плагина функцию Autorun_ExecFunc, которой передает имя MyFunc и массив параметров. Что с этим делать дальше - зависит от автора плагина. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|