Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page 1, 2, 3 ... 145, 146, 147  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Thu Apr 22, 2010 16:06    Post subject: Autorun Reply with quote

Проект начинался с небольшого плагина 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
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2622

Post (Separately) Posted: Thu Apr 22, 2010 17:40    Post subject: Reply with quote

Loopback wrote:
Кому понравится - пользуйтесь

Установил вместо Movebutton. Попробовал на скорую руку все типы команд.
Работает, спасибо!
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Apr 22, 2010 18:01    Post subject: Reply with quote

Quote:
Его значение всегда устанавливается в -1, так что выражение сравнения составляйте так, чтобы результат всегда был False (=0, >0, >-1, <>-1 и т.д.), иначе все файлы будут раскрашены Smile.

А не проще возвращать не число -1, а тупо в функции ContentGetValue возвращать значение ft_nosuchfield? Тогда независимо от возвращенного значения никакой оператор сравнения не будет работать - и раскраски не будет.

А так вроде прикольно, нужные действия можно сделать. И переменные окружения задаваться будут в окружении ТК.

И размерчик наш - не несколько сотен кило. Smile
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Thu Apr 22, 2010 20:22    Post subject: Reply with quote

Quote:
А не проще возвращать не число -1, а тупо в функции ContentGetValue возвращать значение ft_nosuchfield?

Хм, надо попробовать, что-то я ft_nosuchfield упустил.

Quote:
И размерчик наш - не несколько сотен кило.

Да я сам люблю мелкие программы. А при таком функционале использовать VCL - даже как-то неудобно Smile
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Mon Apr 26, 2010 16:44    Post subject: Reply with quote

Небольшое обновление плагина. По совету MVV переделал функцию ContentGetValue, теперь не имеет значения, с чем сравнивать результат поля. И добавил поддержку способов отображения окна для команд запуска (скрытый/свернутый/развернутый) - важная вещь, про которую как-то забыл.

Ссылка в первом посте.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jun 04, 2010 12:13    Post subject: Reply with quote

Тут вопрос возник.
В 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
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Jun 04, 2010 17:25    Post subject: Reply with quote

Кстати, родилась еще одна идея, которая кому-то точно понравится.

Можно добавить команду LoadLibrary, которая будет загружать в память указанную библиотеку. Этого уже будет достаточно для того, чтобы появилась возможность писать плагины к плагинуSmile от такого плагина требуется лишь одна фукция DllMain, в которой он на DLL_PROCESS_ATTACH будет инициализировать и запускать себя, а на DLL_PROCESS_DETACH - финализировать. При загрузке такого плагина нужно лишь запомнить его дескриптор, чтобы при выгрузке Autorun выгрузить и плагин.

То есть, от твоего плагина требуется лишь объявить глобальный список дескрипторов (типа HMODULE) и при выполнении команды LoadLibrary вызывать функцию LoadLibrary для указанного имени файла, а результат помещать в список, если запуск успешен. При выгрузке плагина просто достаешь все элементы списка и вызываешь для них FreeLibrary. Элементарно. Smile

Как первый пример плагина для плагина я вижу библиотечку, которая будет позволять отображать и скрывать в рантайме меню окна тотала, при этом еще и показывать это меню по хоткею (или кнопке панели инструментов). Идея родилась при обдумывании сокрытия меню в TCFS2 (из стороннего приложения обнулять дескриптор меню - не очень хорошая мысль).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Fri Jun 04, 2010 23:10    Post subject: Reply with quote

MVV wrote:
Например, мне надо передать следующую строку как параметр:
И при этом указать рабочую папку "C:\Documents and Settings\All Users". Это реально?

Да, для этого есть возможность использовать одинарные кавычки. Парсер запоминает, с какой кавычки начинается параметр и кавычки другого типа считает вложенными. Смешанные кавычки использовать нельзя, это указано в ридми.
Про эскейп, разумеется, думал (либо про вариант, как сделано в Autoit - кавычки того же типа, как открывающие, внутри строки задваиваются), но решил всё не усложнять, поскольку это все же очень большая редкость, когда параметр содержит кавычки разных типов одновременно.
MVV wrote:
Кстати, родилась еще одна идея, которая кому-то точно понравится.

Мне нравится Smile Это с успехом позволит добавить автозагружаемый функционал без необходимостии добавлять новые цветовые схемы.
А в принципе, можно и вызовы пользовательских функций добавить. Плагин может вызывать некую заданную функцию для получения имен пользовательских функций, и далее, при обнаружении такой в файле конфигурации, вызывать ее и передавать ей параметры - в виде простой неразобранной строки или массива параметров-строк.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sat Jun 05, 2010 08:49    Post subject: Reply with quote

Quote:
Парсер запоминает, с какой кавычки начинается параметр и кавычки другого типа считает вложенными.

Ой, этого я не заметил. Тогда мой бред про кавычки можно забыть. Smile
Все мои случаи парсили стандартную строку параметров, где одинарные кавычки не приняты, поэтому приходилось извращаться. А если у тебя можно заключить строку в одинарные, и использовать в ней двойные - отлично. Кстати, можно добавить возможность вставки кавычки, с которой начинался параметр, указанием двух таких кавычек (например, в строке '/t"Символ ''a'':"' буква a будет обрамляться в одинарные кавычки).

Quote:
Это с успехом позволит добавить автозагружаемый функционал без необходимостии добавлять новые цветовые схемы.

Так о чем и речьSmile можно будет и твои мышиные команды в модуль выделить, чтобы авторан был чисто автораном.

Ну, я думал и про вызов функции без параметров из 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
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Sat Jun 05, 2010 09:53    Post subject: Reply with quote

MVV wrote:
Кстати, можно добавить возможность вставки кавычки, с которой начинался параметр, указанием двух таких кавычек

Ну я уже и писал, думал об этом, но пока решил не усложнять.
MVV wrote:
Ну, я думал и про вызов функции без параметров из DLL. Правда, тут возникает вопрос - что делать после вызова функции - выгружать DLL или нет?

Ок, обдумаем.
MVV wrote:
Все-таки я схожусь к мысли, что необязательные параметры типа добавления/замены текста переменной удобнее добавлять в начале параметров через слэш, так проще парсить, и потом, так число необязательных параметров может быть любым:

Для парсера в данном случае важен порядок параметров. Если возникнет необходимость множества необязательных параметров - можно будет подумать над изменением.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sat Jun 05, 2010 11:53    Post subject: Reply with quote

Quote:
Для парсера в данном случае важен порядок параметров.

Я бы писал парсер строк отдельно, и отдельной функцией сам алгоритм обработки команды, тогда порядок вообще не имеет значения, главное не запутаться, какой параметр за что отвечает - с именованными параметрами запутаться сложно.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Sat Jun 05, 2010 22:50    Post subject: Reply with quote

MVV wrote:
Я бы писал парсер строк отдельно, и отдельной функцией сам алгоритм обработки команды

Так оно в принципе и есть, из функции обработки вызывается нужное число раз парсер, который каждый раз забирает из командной строки один параметр (наподобие стека), т.е. по-порядку. В случае введения именованных параметров, нужно будет дополнительно проверять, является ли параметр именованным, и если нет, дальнейшие параметры обрабатывать как раньше.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Mon Jun 14, 2010 19:46    Post subject: Reply with quote

Ну вот, в первом приближении реализовал. Склоняюсь к мысли перейти для флажков к именованным параметрам, это будет следующий шаг.

Пока же добавил функцию "LoadLibrary", которая работает в двух режимах: просто загружает dll (c опциональным вызовом функции), либо инициализирует ее как плагин. Подробности в ридми.

Пока бета: Скачать
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Tue Jun 15, 2010 16:39    Post subject: Reply with quote

Надеюсь, успею запостить, пока форум в очередной раз за сегодня не сдохнет... Smile

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, дескриптор окна ТК передается плагином (кстати, ты окно ищешь с учетом его принадлежности текущему процессу? Smile). Не представляю, какие еще могут понадобиться дескрипторы для работы. А если и могут, то 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
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1385

Post (Separately) Posted: Tue Jun 15, 2010 23:47    Post subject: Reply with quote

MVV wrote:
А вот с Autorun_PluginInit какой-то косяк - вызывается она явно не как __stdcall, также я пробовал __fastcall и __cdecl, ни при одном из них я не нахожу в стеке этих параметров на нужном месте. Ерунда какая-то. Кстати, какой размер буфера - чему равна MaxListSize (может, хоть ее найду)?

Точно, косяк. Не объявил прототип вызывамой функции как stdcall. Перезалил, должно работать.
MVV wrote:
Корректные прототипы функций:

Спасибо, делал по памяти, позабыл уже.
MVV wrote:
И вопрос - что такое HModule nProcID? В Си нет такого типа, но есть тип HMODULE (регистр в Си важен). Но я вообще не въеду, что с этим хэндлом можно делать. Зачем он?

Согласен, передавать результат вызова одной стандартной функции - излишество Smile Уберу.
MVV wrote:

дескриптор окна ТК передается плагином (кстати, ты окно ищешь с учетом его принадлежности текущему процессу? ).

Конечно.
MVV wrote:

Не представляю, какие еще могут понадобиться дескрипторы для работы. А если и могут, то DLL их по идее может получить так же точно, как и твой плагин.

Могут, конечно, но почему бы не передать некоторые данные, поиск которых занимает некоторое время, но которые уже найдены?
Собственно идея была именно в этом. Если возникнут какие-нибудь мысли насчет такой информации - можно ее добавить в структуру.
MVV wrote:
Также плохо понятно (хотя смотрится интересно), зачем добавлять функции из DLL в список. Их потом можно прямо из конфига запускать?

Это не "реальные" экспортируемые функции dll. Например, плагин сообщает, что он поддерживает некую функцию "MyFunc". Мы можем это имя использовать в скрипте, причем с неограниченным количеством параметров. Autorun парсит строку и вызывает из соответствующего плагина функцию Autorun_ExecFunc, которой передает имя MyFunc и массив параметров. Что с этим делать дальше - зависит от автора плагина.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3 ... 145, 146, 147  Next
Page 1 of 147

 
Jump to:  
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