Использование wdx-плагинов в скриптах

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Использование wdx-плагинов в скриптах

Сообщение Batya »

Из темы Сортировка mp3 по каталогам с учётом id3 тегов.:
Lev писал(а):Имхо, лучше в отдельной теме.
Для скриптов было бы интересно оформление в виде ActiveX, чтобы не возиться с WshShell.Exec, StdOut...
Решил начать тему.
Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Накидал краткий пример получения поля контентного плагина при помощи wdxtest.exe. Получаем все поля с помощью утилиты, а затем RegExp'ами выкусываем из текстовки нужные значения. Без обработки ошибок.

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

'получение поля контентного плагина при помощи wdxtest.exe
'lev
wdxtest="c:\WINCMD\utils\wdxtest\wdxtest.exe"'путь к wdxtest.exe
wdxplug="c:\WINCMD\Content_wdx\NameChrCount\Filename_ChrCount.wdx"'путь к контентному плагину
filename="c:\WINCMD\Content_wdx\NameChrCount\Filename_ChrCount.wdx"'путь к файлу инфу о котором получаем

Set WshShell = CreateObject("WScript.Shell")
Set res=WshShell.Exec(wdxtest & " " & wdxplug & " " & filename)
c=res.StdOut.ReadAll

'MsgBox c 'для отладки, для составления правильного паттерна
Dim re

Set re = New RegExp
re.Global = True
re.IgnoreCase = True
re.MultiLine = False

re.Pattern = "1: Filename \(ChrCount\): (.*)" 'кол-во букв в имени файла
  
Set field=re.Execute(c)
MsgBox field(0).Submatches(0)
Теперь можем создавать директории, двигать и переименовывать файлы и т.д. и т.п.
Когда рассекретится wdx.exe, возможно, сможем получать нужные поля напрямую, что ускорит обработку большого количества файлов. Чем работать с wdx по ActiveX пока не знаю, самому писать обёртку лень.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Lev
Отлично!

Я вот, правда, хочу оформить в vbs-скрипте вызов wdx непосредственно как dll. Только пока, к сожалению, нет возможности уделить на это время :(
Нет, я не сплю. Я просто медленно моргаю.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Если интересно, вот моя реализация на Autoit, я с помощью этого скрипта тестирую плагины. Переделать под конкретные нужды и прикрутить обработку регэкспами - дело нескольких десятков минут.

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

#include <Array.au3>

Global $sFile = @ScriptDir & "\TestTorrent.torrent"
Global $sWdxPlugin = @ScriptDir & "\TCTorrent.wlx"
Global $nUnitIdx = 0

Global Const $ft_nomorefields = 0
Global Const $ft_numeric_32 = 1
Global Const $ft_numeric_64 = 2
Global Const $ft_numeric_floating = 3
Global Const $ft_date = 4
Global Const $ft_time = 5
Global Const $ft_boolean = 6
Global Const $ft_multiplechoice = 7
Global Const $ft_string = 8
Global Const $ft_fulltext = 9
Global Const $ft_datetime = 10
Global Const $ft_stringw = 11

Global $aFields[1][3]

For $i = 0 To 255
    $aRet = DllCall($sWdxPlugin, "int", "ContentGetSupportedField", "int", $i, "str", "", "str", "", "int", 65535)
    If @error Then ExitLoop
    If $aRet[0] = $ft_nomorefields Then ExitLoop
    ReDim $aFields[$i+1][3]
    $aFields[$i][0] = $aRet[0]
    $aFields[$i][1] = $aRet[2]
    $aFields[$i][2] = $aRet[3]
Next

If UBound($aFields) = 0 Then
    MsgBox (0, "", "No fields.")
    Exit
EndIf

Global $aValues[UBound($aFields)][2]
Global $nMaxBuffSize = 65535
Global $pBuffer = DllStructCreate("byte[65535]")

For $i=0 To UBound($aFields) - 1
    $aRet = DllCall($sWdxPlugin, "int", "ContentGetValue", "str", $sFile, "int", $i, "int", $nUnitIdx, "ptr", DllStructGetPtr($pBuffer), "int", $nMaxBuffSize, "int", 0)
    If @error Then ExitLoop
    Switch $aFields[$i][0]
        Case $ft_numeric_32
            $pValue = DllStructCreate("int", DllStructGetPtr($pBuffer))
        Case $ft_numeric_64
            $pValue = DllStructCreate("int64", DllStructGetPtr($pBuffer))
        Case $ft_numeric_floating
            $pValue = DllStructCreate("double", DllStructGetPtr($pBuffer))
        Case $ft_string, $ft_fulltext
            $pValue = DllStructCreate("char[" & $nMaxBuffSize & "]", DllStructGetPtr($pBuffer))
        Case $ft_datetime
            $pFileTime = DllStructCreate("dword;dword", DllStructGetPtr($pBuffer))
            $pLocalTime = DllStructCreate("dword;dword")
            DllCall("Kernel32.dll", "int", "FileTimeToLocalFileTime", "ptr", DllStructGetPtr($pFileTime), "ptr", DllStructGetPtr($pLocalTime))
            $pValue = DllStructCreate("short;short;short;short;short;short;short;short")
            DllCall("Kernel32.dll", "int", "FileTimeToSystemTime", "ptr", DllStructGetPtr($pLocalTime), "ptr", DllStructGetPtr($pValue))
            $aValues[$i][0] = $aFields[$i][1]
            $aValues[$i][1] = StringFormat("%04d-%02d-%02d %02d:%02d:%02d", _
                                           DllStructGetData($pValue, 1), _
                                           DllStructGetData($pValue, 2), _
                                           DllStructGetData($pValue, 4), _
                                           DllStructGetData($pValue, 5), _
                                           DllStructGetData($pValue, 6), _
                                           DllStructGetData($pValue, 7))
            ContinueLoop
        Case Else
            ContinueLoop
    EndSwitch
    $aValues[$i][0] = $aFields[$i][1]
    $aValues[$i][1] = DllStructGetData($pValue, 1)
Next

_ArrayDisplay($aValues)
Готовой реализации через COM не знаю, писать тоже неохота, т.к. предпочитаю максимально портабельные решения, и в этом Autoit очень помогает.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Re: Использование wdx-плагинов в скриптах

Сообщение Tol!k »

Batya писал(а):Кто-нибудь имеет опыт вытаскивания информации с помощью wdx-плагинов в скриптах, по возможности через COM?
Batya писал(а):хочу оформить в vbs-скрипте вызов wdx непосредственно как dll
С помощью вот этого не получится?
Пишут: предоставляет возможность из скриптов на JScript и VBScript вызывать функции, экспортируемые dll-библиотеками
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Tol!k
Спасибо, но ...
Batya писал(а):Только пока, к сожалению, нет возможности уделить на это время
:(
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

wdx ActiveX
Решил создать отдельную тему, чтобы не валить всё в кучу.
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Lev писал(а): Когда рассекретится wdx.exe, возможно, сможем получать нужные поля напрямую, что ускорит обработку большого количества файлов.
Рассекреченный wdx.exe (точнее это переписанная с нуля утиль) выложил в родительской теме (см. ссылку в первом посте в этой теме), так что можете получать все поля напрямую, без выкусывания нужных значений регулярками.
П.С. Кстати, Loopback выложил хороший скрипт, но там есть мелкие ошибки и плюс не со всеми плагами он будет работать (в частности с ShellDetails.wdx вряд ли заработает, равно как и wdxtest.exe).
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

[off]Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог :)[/off]
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Странно, вроде раньше не было проблем, тогда куда лучше переложить?
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

[off]Любой долгонеудаляемый обменник без пометки "только для AU-IX", или как его там. Например, завести сайтик второго уровня на каком-нибудь из кучи позволяющих это сайтов типа почтовых сервисов.
А лучше всего получить статус автора на totalcmd.net/wincmd.ru, а заодно и поддоменчик у наших уважаемых админов.[/off]
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

[off]
Lev писал(а):а заодно и поддоменчик у наших уважаемых админов.
Сразу уточню, что поддоменчик не получится. А вот акк — запросто.
[/off]
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

[offtop]
Lev писал(а):Для меня секретность заключалась не в закрытости кода, а выкладывании утилитки на обменнике "только для украинцев", т.е. я её даже погонять не мог :)
Ты бы описал проблему попроще и кто-нибудь обязательно переложил бы утиль на другой обменник.
Я без проблем скачал обе утилиты не смотря на карточку "Non AU-IX IP ..."
[/offtop]
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

Создал отдельную тему и выложил файл на мультиобиенник.
Тема - http://forum.wincmd.ru/viewtopic.php?t=13510
Skif_off
Сообщения: 1255
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Loopback
А с какой версией AutoIt вы используете (или использовали) скрипт для тестирования плагинов? 3.3.8.1 и 3.3.12.0 падают, попробовал версии старее, ориентируясь на дату поста: с 3.2.12.1-3.3.2.0 не работает.
Вроде код очевиден, но не пойму куда копать.
Ответить