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 Previous  1, 2, 3 ... 128, 129, 130 ... 133, 134, 135  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
lz57005



Joined: 05 Mar 2020
Posts: 26

Post (Separately) Posted: Fri Sep 29, 2023 11:18    Post subject: Reply with quote

Возможно странный запрос, но тем не менее есть различный софт который использует COM dll для, например, интеграции в контекстное меню проводника. Кончено же хотелось бы иметь подобное в портативном виде. В начале я подумал что можно просто делать регистрацию через regsvr32 при запуске тс и разрегистрировать в конце, но это требует админ прав. Нашёл альтернативный regsrv32.exe который делает тоже самое, но под текущим пользователем без прав админа. Однако хотелось бы чтобы расширения были доступны только из контекстного меню вызываемого тс, а не по всей системе. Беглый гугл по запросу "load com dll without registration" говорит что возможно подобную либу подгрузить процессу без регистрации, но моих навыков недостаточно для подобного, вот и вопрос реально ли это?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10272
Location: Россия, Саратов

Post (Separately) Posted: Fri Sep 29, 2023 17:56    Post subject: Reply with quote

А какое отношение это имеет к текущей теме?
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
lz57005



Joined: 05 Mar 2020
Posts: 26

Post (Separately) Posted: Fri Sep 29, 2023 19:01    Post subject: Reply with quote

Autorun загружается в память тотала и перехватывает различные функции, я предположил что находясь в памяти процесса вполне себе можно или хукнуть вызов контекстного меню проводника при пкм, или непосредственно реализовать подгрузку com dll, считайте это запросом на новую фичу у плагина. К тому же "Загрузка dll" одна из заявленных функций плагина.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1293

Post (Separately) Posted: Sat Sep 30, 2023 13:19    Post subject: Reply with quote

lz57005
Увы, я тоже не имею существенного опыта работы с COM.

Загружать dll и создавать объекты без регистрации точно можно, например, в Autoit такая возможность есть, хотя и в экспериментальном статусе. Вот только не факт что это поможет. Насколько я понял при беглом ознакомлении с работой расширений, они требуют прописывания в реестре как обработчика. И как правило в HKLM, так что тут без админа все равно не обойтись.

По идее, для тех расширений, которым достаточно ветки HCU, обработчик можно прописать в реестр вручную, зная его CLSID. Т.е. теоретически это можно сделать с помощью простого RegWrite. А при выходе удалить. Это только идея, будет ли такое работать не проверял.

Если же вообще не использовать механизмы оболочки для работы с расширением, то это выглядит... сложновато.
Back to top
View user's profile Send private message
lz57005



Joined: 05 Mar 2020
Posts: 26

Post (Separately) Posted: Wed Jan 31, 2024 17:45    Post subject: Reply with quote

Loopback
Подскажите, решил использовать плагин не как псевдо-wdx, а как обычную dll через патч таблицы импорта totalcmd.exe, понимаю что кроме меня вряд ли подобным многие маются, но тем не менее так я не завишу от цветовых схем и можно успеть изменить wincmd.ini до того как программа его прочтёт.

Если запуск autorun я пофиксил самописной prepare.dll которая назначает переменные среды COMANDER_PATH etc (т.к. процесс этого не успевает и autorun.cfg где эти переменные естественно фигурируют функционирует не корректно). Но я не знаю что сделать с директивой

Pragma AutorunFinalizeSection

я думал она выполняется в момент выгрузки плагина как обычной dll, на условное событие OnProcessDetach, но как я понял - есть отдельное событие именно выгрузки как плагина которое не происходит в моём случаем и секция конфига не выполняется.

Соответственно просьба/вопрос
Можно ли продублировать действие в момент OnProcessDetach (что-то типо если PluginUnload не выполнялась, то выполнить сейчас) или добавить директиву Pragma AutorunUnload? Или как мне самому можно это пофиксить самописной dll которая будет провоцировать выполнение AutorunFinalizeSection при выгрузке?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1293

Post (Separately) Posted: Wed Jan 31, 2024 22:21    Post subject: Reply with quote

lz57005 wrote:
через патч таблицы импорта totalcmd.exe

И как тотал реагирует на такую модификацию? В нем же вроде защита присутствует.

lz57005 wrote:
я думал она выполняется в момент выгрузки плагина как обычной dll, на условное событие OnProcessDetach

Так и есть, остановка по DLL_PROCESS_DETACH, по крайней мере в последних версиях. Пробовал когда-то делать выгрузку в ContentPluginUnloading, но кажется там были какие-то проблемы, в итоге вернулся к этому методу.
Back to top
View user's profile Send private message
lz57005



Joined: 05 Mar 2020
Posts: 26

Post (Separately) Posted: Wed Jan 31, 2024 22:54    Post subject: Reply with quote

Loopback wrote:
И как тотал реагирует на такую модификацию? В нем же вроде защита присутствует.

Конечно присутствует, но на что не пойдёшь ради экспериментов Wink
Loopback wrote:
Так и есть, остановка по DLL_PROCESS_DETACH, по крайней мере в последних версиях. Пробовал когда-то делать выгрузку в ContentPluginUnloading, но кажется там были какие-то проблемы, в итоге вернулся к этому методу.

Тогда что-то не так, плагин 2.2.10, конфиг условно:

LoadLibrary Plugins\Run\Prepare.dll
...
MsgBox "OnStart"
Pragma AutorunFinalizeSection
ShellExec "%COMMANDER_PATH%\Core\CloseTest.cmd"
MsgBox "OnClose"

в prepare.dll на DLL_PROCESS_DETACH свой вывод MessageBox
в CloseTest.cmd - echo в файл

при закрытии тотала, отрабатывает только MessageBox из prepare.dll.
а если использовать как обычно через wdx то всё ок.
запуск CloseTest.cmd,
Сообщение OnClose,
а потом сообщение от prepare.dll о выгрузке,
вот я и подумал что используется некий ContentPluginUnloading.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1293

Post (Separately) Posted: Thu Feb 01, 2024 00:43    Post subject: Reply with quote

lz57005 wrote:
при закрытии тотала, отрабатывает только MessageBox из prepare.dll.

Это Autorun выгружает библиотеку prepare.dll. И раз он её выгружает, значит секция финализации к тому времени уже отработала, выгрузка библиотек идёт в последнюю очередь.

Почему конкретно в данном случае не выполняется то что в секции - не могу сказать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 202

Post (Separately) Posted: Mon Feb 05, 2024 20:29    Post subject: Reply with quote

Может быть не совсем в тему, но как изменить переменные окружения, создаваемые в autorun.cfg командой SetEnv, в ходе выполнения самого процесса Total Commander?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1293

Post (Separately) Posted: Tue Feb 06, 2024 23:03    Post subject: Reply with quote

Orion9
Чтобы поменять переменную, нужно её менять в адресном пространстве тотала. Проще всего с помощью самого Autorun и TCFS2. Модифицированный пример из справки:

Quote:

LoadLibrary Plugins\Autorun_Tweaks.dll

# Функция, которая будет выполнена при получении сообщения
Func MyMessageFunc()
SetEnv ENV_NAME "Новый текст переменной"
EndFunc

# Привязываем функцию к сообщению, регистрируемому строкой "MyMessage"
SetMessageAction "MyMessage" MyMessageFunc


И вызываем функцию с помощью запуска TCFS2 с командой:

TCFS2.exe /ef "msg(regmsg(MyMessage), 0, 0)"
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 202

Post (Separately) Posted: Wed Feb 07, 2024 01:11    Post subject: Reply with quote

Loopback
Спасибо! Я попробую.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 202

Post (Separately) Posted: Wed Feb 07, 2024 20:02    Post subject: Reply with quote

Проверил. Все работает гладенько Smile Классный плуг вы сделали, очень продвинутый. Еще раз спасибо!

P.S. Не могли бы вы раскрыть пример, как правильно зарегистрировать и принимать сообщения с параметрами? А то в справке об этом нету.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1293

Post (Separately) Posted: Thu Feb 08, 2024 23:29    Post subject: Reply with quote

Orion9
Регистрация практически такая же, нужно только добавить переключатель /P, чтобы в дополнение к пользовательским параметрам команды (если они есть) добавлялись стандартные 4 параметра сообщения. Их формальные имена в функции могут быть произвольными, те что в примере просто соответствуют принятым в Winapi. Из них wParam и lParam могут задаваться пользователем при отправке сообщения. Могут быть только числами.

Вот простой пример, аналогичный тому что выше:

Code:

LoadLibrary Plugins\Autorun_Tweaks.dll

# Функция, которая будет выполнена при получении сообщения
Func MyMessageFunc(hWnd, uMsg, wParam, lParam)
  Local text
  Switch wParam
    Case 1
      text = "Первый вариант"
    Case 2
      text = "Второй вариант"
  EndSwitch 
 
  SetEnv ENV_NAME  %text%
EndFunc

# Привязываем функцию к сообщению, регистрируемому строкой "MyMessage", переключатель /P подразумевает, что функция MyMessageFunc должна иметь минимум четыре параметра.
SetMessageAction /P "MyMessage" MyMessageFunc


Теперь можно выполнить TCFS2 с командой, в которой передаем 1 или 2 в качестве параметра сообщения, в зависимости от них будут выполняться разные действия:

TCFS2.exe /ef "msg(regmsg(MyMessage), 1, 0)"
TCFS2.exe /ef "msg(regmsg(MyMessage), 2, 0)"
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 202

Post (Separately) Posted: Thu Feb 08, 2024 23:55    Post subject: Reply with quote

Loopback
Очень полезная информация. Спасибо Smile
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 202

Post (Separately) Posted: Mon Mar 04, 2024 13:17    Post subject: Reply with quote

Loopback
В плагине SysInfo есть функция GetWMIValue, которая считывает значение параметра WMI-класса в переменную.
Code:

GetWMIValue VAR "Name" "SELECT * FROM Win32_Processor"

А как считать несколько параметров в одном запросе? Сейчас такой возможности нет?
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 Previous  1, 2, 3 ... 128, 129, 130 ... 133, 134, 135  Next
Page 129 of 135

 
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