View previous topic :: View next topic |
Author |
Message |
lz57005
Joined: 05 Mar 2020 Posts: 26
|
(Separately) Posted: Fri Sep 29, 2023 11:18 Post subject: |
|
|
Возможно странный запрос, но тем не менее есть различный софт который использует COM dll для, например, интеграции в контекстное меню проводника. Кончено же хотелось бы иметь подобное в портативном виде. В начале я подумал что можно просто делать регистрацию через regsvr32 при запуске тс и разрегистрировать в конце, но это требует админ прав. Нашёл альтернативный regsrv32.exe который делает тоже самое, но под текущим пользователем без прав админа. Однако хотелось бы чтобы расширения были доступны только из контекстного меню вызываемого тс, а не по всей системе. Беглый гугл по запросу "load com dll without registration" говорит что возможно подобную либу подгрузить процессу без регистрации, но моих навыков недостаточно для подобного, вот и вопрос реально ли это? |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10272 Location: Россия, Саратов
|
(Separately) Posted: Fri Sep 29, 2023 17:56 Post subject: |
|
|
А какое отношение это имеет к текущей теме? _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
lz57005
Joined: 05 Mar 2020 Posts: 26
|
(Separately) Posted: Fri Sep 29, 2023 19:01 Post subject: |
|
|
Autorun загружается в память тотала и перехватывает различные функции, я предположил что находясь в памяти процесса вполне себе можно или хукнуть вызов контекстного меню проводника при пкм, или непосредственно реализовать подгрузку com dll, считайте это запросом на новую фичу у плагина. К тому же "Загрузка dll" одна из заявленных функций плагина. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Sat Sep 30, 2023 13:19 Post subject: |
|
|
lz57005
Увы, я тоже не имею существенного опыта работы с COM.
Загружать dll и создавать объекты без регистрации точно можно, например, в Autoit такая возможность есть, хотя и в экспериментальном статусе. Вот только не факт что это поможет. Насколько я понял при беглом ознакомлении с работой расширений, они требуют прописывания в реестре как обработчика. И как правило в HKLM, так что тут без админа все равно не обойтись.
По идее, для тех расширений, которым достаточно ветки HCU, обработчик можно прописать в реестр вручную, зная его CLSID. Т.е. теоретически это можно сделать с помощью простого RegWrite. А при выходе удалить. Это только идея, будет ли такое работать не проверял.
Если же вообще не использовать механизмы оболочки для работы с расширением, то это выглядит... сложновато. |
|
Back to top |
|
|
lz57005
Joined: 05 Mar 2020 Posts: 26
|
(Separately) Posted: Wed Jan 31, 2024 17:45 Post subject: |
|
|
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 |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Wed Jan 31, 2024 22:21 Post subject: |
|
|
lz57005 wrote: | через патч таблицы импорта totalcmd.exe |
И как тотал реагирует на такую модификацию? В нем же вроде защита присутствует.
lz57005 wrote: | я думал она выполняется в момент выгрузки плагина как обычной dll, на условное событие OnProcessDetach |
Так и есть, остановка по DLL_PROCESS_DETACH, по крайней мере в последних версиях. Пробовал когда-то делать выгрузку в ContentPluginUnloading, но кажется там были какие-то проблемы, в итоге вернулся к этому методу. |
|
Back to top |
|
|
lz57005
Joined: 05 Mar 2020 Posts: 26
|
(Separately) Posted: Wed Jan 31, 2024 22:54 Post subject: |
|
|
Loopback wrote: | И как тотал реагирует на такую модификацию? В нем же вроде защита присутствует. |
Конечно присутствует, но на что не пойдёшь ради экспериментов
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 |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Thu Feb 01, 2024 00:43 Post subject: |
|
|
lz57005 wrote: | при закрытии тотала, отрабатывает только MessageBox из prepare.dll. |
Это Autorun выгружает библиотеку prepare.dll. И раз он её выгружает, значит секция финализации к тому времени уже отработала, выгрузка библиотек идёт в последнюю очередь.
Почему конкретно в данном случае не выполняется то что в секции - не могу сказать. |
|
Back to top |
|
|
Orion9
Joined: 01 Jan 2024 Posts: 202
|
(Separately) Posted: Mon Feb 05, 2024 20:29 Post subject: |
|
|
Может быть не совсем в тему, но как изменить переменные окружения, создаваемые в autorun.cfg командой SetEnv, в ходе выполнения самого процесса Total Commander? |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Tue Feb 06, 2024 23:03 Post subject: |
|
|
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 |
|
|
Orion9
Joined: 01 Jan 2024 Posts: 202
|
(Separately) Posted: Wed Feb 07, 2024 01:11 Post subject: |
|
|
Loopback
Спасибо! Я попробую. |
|
Back to top |
|
|
Orion9
Joined: 01 Jan 2024 Posts: 202
|
(Separately) Posted: Wed Feb 07, 2024 20:02 Post subject: |
|
|
Проверил. Все работает гладенько Классный плуг вы сделали, очень продвинутый. Еще раз спасибо!
P.S. Не могли бы вы раскрыть пример, как правильно зарегистрировать и принимать сообщения с параметрами? А то в справке об этом нету. |
|
Back to top |
|
|
Loopback
Joined: 07 Sep 2009 Posts: 1293
|
(Separately) Posted: Thu Feb 08, 2024 23:29 Post subject: |
|
|
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 |
|
|
Orion9
Joined: 01 Jan 2024 Posts: 202
|
(Separately) Posted: Thu Feb 08, 2024 23:55 Post subject: |
|
|
Loopback
Очень полезная информация. Спасибо |
|
Back to top |
|
|
Orion9
Joined: 01 Jan 2024 Posts: 202
|
(Separately) Posted: Mon Mar 04, 2024 13:17 Post subject: |
|
|
Loopback
В плагине SysInfo есть функция GetWMIValue, которая считывает значение параметра WMI-класса в переменную.
Code: |
GetWMIValue VAR "Name" "SELECT * FROM Win32_Processor"
|
А как считать несколько параметров в одном запросе? Сейчас такой возможности нет? |
|
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
|