Страница 1 из 2

Переносной Script Helper ActiveX for TC by Volniy

Добавлено: Ср ноя 25, 2015 18:54
Flasher
  • Script Helper ActiveX for TC

    Из справки:
    Управление Total Commander-ом из различных программных сред,
    поддерживающих COM-технологию. Некоторые команды и функции могут
    быть применены в WSH скриптах для целей, никак не связанных с TC.
    Детали работы смотрите в прилагаемом ReadMe.txt.
    Постоянная страница компонента.

    Уже года 3-4 как пользуюсь портабельным Хелпером, но всё никак руки не доходили опубликовать решение, хотя паре человек обещал.
    Что ж, с большим запозданием, но публикую статью на TCKB.

    Также сообщаю, что компонент обновлён до версии 1.0.0.14, здесь появился новый метод GetInfo на основе возвращаемых WMCopyData данных.
    Один пример приведён в статье. Далее публикую vbs-скрипт, отображающий сразу все варианты.

Код: Выделить всё

'=========================================================== 
' Демонстрация использования метода GetInfo вспомогательного 
' для ТС компонента "Script Helper ActiveX for TC by Volniy" 
'=========================================================== 

Set TCHelper = CreateObject("TCScript.Helper") 
TCHelper.Pause = 0 : T = vbTab : C = vbCr 

For Each N in Split("LP LC LI LN RP RC RI RN SP SC SI SN TP TC TI TN") 
  Select Case(Mid(N, 2)) 
    Case "P" T1 = "Путь" 
    Case "C" T1 = "Число объектов" 
    Case "I" T1 = "№ объекта под курсором" 
    Case "N" T1 = "Имя объекта под курсором" 
  End Select 
  Select Case(Left(N,1)) 
    Case "S" T2 = "активной"  : Case "R" T2 = "правой" 
    Case "T" T2 = "пассивной" : Case "L" T2 = "левой" 
  End Select : Execute N & "= T1 & "" "" & T2 & """ &_ 
  " панели:"" & T & TCHelper.GetInfo(CStr(N)) & vbCr" 
Next: If TCHelper.GetInfo("A") = "L" Then A = "левая" Else A = "правая" 

MsgBox T & T & "Активная панель:" & T & T & A & C & C & T & SC & T &_ 
TC & T & LC & T & RC &T & C & SI & TI & LI & RI & C & SN & TN & LN &_ 
RN & C & SP & TP & LP & RP,, Space(18) & "Данные WM_CopyData для TC"
Либо так:

Код: Выделить всё

'=========================================================== 
' Демонстрация использования метода GetInfo вспомогательного 
' для ТС компонента "Script Helper ActiveX for TC by Volniy" 
'=========================================================== 

Set TCHelper = CreateObject("TCScript.Helper") 
TCHelper.Pause = 0 : T = vbTab : C = vbCr 
Call WM_CopyData("LP")("LC")("LI")("LN")("RP")("RC")_ 
("RI")("RN")("SP")("SC")("SI")("SN")("TP")("TC")("TI")("TN") 
If TCHelper.GetInfo("A") = "L" Then A = "левая" Else A = "правая" 

MsgBox T & T & "Активная панель:" & T & T & A & C & C & T & SC & T &_ 
TC & T & LC & T & RC &T & C & SI & TI & LI & RI & C & SN & TN & LN &_ 
RN & C & SP & TP & LP & RP,, Space(18) & "Данные WM_CopyData для TC" 

Function WM_CopyData(Var) 
  Select Case(Mid(Var, 2)) 
    Case "P" T1 = "Путь" 
    Case "C" T1 = "Число объектов" 
    Case "I" T1 = "№ объекта под курсором" 
    Case "N" T1 = "Имя объекта под курсором" 
  End Select 
  Select Case(Left(Var,1)) 
    Case "S" T2 = "активной"  : Case "R" T2 = "правой" 
    Case "T" T2 = "пассивной" : Case "L" T2 = "левой" 
  End Select : Execute Var & "= T1 & "" "" & T2 & """&_ 
  " панели:"" & T & TCHelper.GetInfo(CStr(Var)) & vbCr" 
  Set WM_CopyData = GetRef("WM_CopyData") 
End Function

Добавлено: Ср ноя 25, 2015 21:26
Staniclaw
То есть с этой штукой не нужны никакие копания ни в реестре, ни в системных файлах? Всё необходимое будет на флешке? Класс!

Добавлено: Ср ноя 25, 2015 21:38
Flasher
Staniclaw
Я так понял, то были риторические вопросы, ибо в статье об этом написано, надеюсь, понятным языком. :wink:

Добавлено: Ср ноя 25, 2015 21:45
Staniclaw
Flasher
Они самые. Всё равно класс. Представляю, как обрадуются сборщики.

Добавлено: Вс ноя 29, 2015 12:27
Flasher
В статье исправлен манифест для Хелпера. Компонент по ссылке со сборкой обновлён.
Staniclaw писал(а):Представляю, как обрадуются сборщики
Ну, пока никто из них не объявился, несмотря на старый манифест. Так что не факт, что сборщики если и будут, то публичные.

Добавлено: Ср дек 23, 2015 13:03
Flasher
Flasher писал(а):В статье исправлен манифест для Хелпера. Компонент по ссылке со сборкой обновлён.
  • • Оптимизирован код компонента (по размеру немного ужался).
    • Добавлена полная поддержка Юникода.
    • Добавлено свойство NoArrayReturn.
    • Модифицирован метод GetFilter.
    • Добавлен ReadMe.txt с некоторыми правками.
Есть одна недоделка с декодированием Юникода, шифрованного в ANSI, как это происходит в INI-файлах.
Но автор 2 недели не появлялся, поэтому, чтобы сильно не тянуть, выложил то, что реализовано на данный момент.

[+] В статье смотрите важное дополнение перед п. 7) (совсем вылетело из головы сразу написать об этом).

Добавлено: Пт янв 08, 2016 03:26
addhaloka
Flasher
Чёто не хочет работать, выдаёт ошибку :? Завёлся только после регистрации TCScript.dll, но насколько понимаю, целью было избавиться именно от этого? Проверял с примером отсюда и из статьи, сборка Хелпера также из статьи, TCx64 8.52a, Win 8.1 x64.

Добавлено: Пт янв 08, 2016 12:38
Flasher
addhaloka
Интерпретатор в строку "Команда:" подставлялся тот, что из архива?
И если до этого запускались предыдущие версии, то см. выше [+].

Добавлено: Пт янв 08, 2016 13:13
Avada
addhaloka
То, что написано здесь про важное дополнение, учтено? Говоря проще, в кнопке или юзер-команде в поле "Команда" путь к wscript.exe перед путём скрипта дописывался? У меня, пока этого не сделал, было ровно то же сообщение.
P.S. О, чуть опередили...

Добавлено: Пт янв 08, 2016 16:58
addhaloka
Flasher
С тем, что в архиве - ситуация такая: 7-Zip отказывается его распаковывать, ругаясь на невозможность создать симлинк (может тут собака зарыта - где-то прав не хватает? С запущенным от админа 7-Zip удалось извлечь, но не получается поменять его свойства :D ), а WinRAR просто его не извлекает. Поэтому скопировал интерпретатор из %windir%\SysWOW64. Предыдущие версии не пробовал, вчера впервые решил глянуть.

Avada
С этим я тоже столкнулся, но уже после выяснения проблемы с TCScript.dll - подумал, что:
Показать

Код: Выделить всё

// это не нужно
%COMMANDER_PATH%\Plugins\EXE\TCScript\wscript.exe
// достаточно системного, т. е. такой команды
wscript.exe
но как чуть поздней оказалось - нужно.

С зарегистрированной TCScript.dll - всё прекрасно работает. Необходимость регистрации совершенно не напрягает, не вижу в это ничего страшного - обычно для подобных случаев пользуюсь батником, типа такого:
Показать

Код: Выделить всё

@echo off
cls
rem color 1b
%~d0
cd "%~dp0"

reg query HKCR | findstr /i "TCScript.Helper" >NUL
if not errorlevel 1 (
regsvr32 /u /s TCScript.dll
cls
echo Компонент Script Helper ActiveX for TC удалён из системы
echo Нажмите любую клавишу для выхода . . .
pause >NUL
) else (
regsvr32 /s TCScript.dll
cls
echo Компонент Script Helper ActiveX for TC зарегистрирован в системе
echo Нажмите любую клавишу для выхода . . .
pause >NUL
)
но хотелось бы разобраться, и как сейчас подумал - на машине без возможности получения адм. прав, батник наверное уже не поможет.

Добавлено: Пт янв 08, 2016 17:16
Flasher
addhaloka писал(а):Поэтому скопировал интерпретатор из %windir%\SysWOW64.
Идём в статью и читаем:
для компонентов с 32-битной разрядностью из папки %Windir%\SysWOW64
addhaloka писал(а):Необходимость регистрации совершенно не напрягает
В таком случае в этой ветке особо и делать нечего. Тут про портабельность. См. предисловие в статье.

Добавлено: Пт янв 08, 2016 17:23
addhaloka
Flasher писал(а):Идём в статью и читаем:
У меня Win 8.1 x64, а в x64 осях всё 32-х битное лежит именно в SysWOW64.
Flasher писал(а):В таком случае в этой ветке особо и делать нечего.
Ну тогда проехали. Буду сюда заглядывать - может, кто на досуге попробует разобраться, мне чего-то лень. :)

Добавлено: Пт янв 08, 2016 18:20
Flasher
addhaloka писал(а):в x64 осях всё 32-х битное лежит именно в SysWOW64.
И правда. Надо будет исправить.
В общем, безотносительно версий, имеем попытки вызова. Если была неудачная, то переходим к [+].

Avada
А ты тестировал на TCx64?

Добавлено: Пт янв 08, 2016 19:28
Avada
Flasher
Нет, только на 32 пока успел. Но сейчас попробовал несколько скриптов на x64 (естественно, уже с другим wscript.exe). Не работает.

Добавлено: Пн янв 11, 2016 13:36
MVV
Я проверял на 64-битной системе, используя 32-битный wscript, всё работает как из 32-битного тотала, так и из 64-битного. Компонент на моей машине никогда не устанавливался и не установлен, поэтому портабельность была 146%, я гарантирую это.

Достаточно положить 32-битный wscript.exe (взятый из SysWOW64) в папку с распакованным пакетом из статьи и запускать скрипты только через него (т.е. указывать в командной строке сначала путь к нашей копии wscript, а потом путь к самому скрипту - как и показано в статье), иначе будет запускаться системный wscript, на который манифест из статьи не распространяется (т.к. манифест должен лежать рядом с экзешником), следовательно, никакой портабельной привязки к компоненту не будет.

А ошибка 800A01AD появляется при попытке загрузить модуль другой разрядности (т.е. в данном случае при попытке использования 64-битного wscript).