[WCX] Wcx6432: 64-в-32-битный транслятор для WCX плагинов
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3, 4  Next  :| |:
Total Commander -> Плагины Total Commander

#1: [WCX] Wcx6432: 64-в-32-битный транслятор для WCX плагинов Author: MVVLocation: Ростов-Дон PostPosted: Tue Jun 14, 2016 12:38
    —
Wcx6432 позволяет использовать 32-битные WCX-плагины в 64-битном ТК.

Wcx6432 Beta 224


Установка:

1. Извлеките в любую папку.
2. Поместите файл Wcx6432.ini в папку ТК и поправьте в нём пути к файлам транслятора.
3. Скопируйте Wcx6432.wcx64 в папки желаемых 32-битных WCX-плагинов и переименуйте согласно именам плагинов (например, в случае плагина MSI-Plus.wcx имя файла должно быть MSI-Plus.wcx64).


Как работает транслятор:

ТК обращается к маленькому загрузчику Wcx6432.wcx64, который читает Wcx6432.ini и загружает Wcx6432-клиента (Wcx6432c.dll), затем клиент запускает Wcx6432-сервер (Wcx6432s.exe) и устанавливает соединение с ним. Сервер загружает 32-битный плагин и вызывает его функции, когда ТК вызывает эти функции у загрузчика. Так, только маленький загрузчик присутствует в нескольких экземплярах, остальные файлы лежат в одном месте и легко могут быть обновлены.

Плагин пока на бета-стадии, поддерживаются не все функции.
Большинство функций поддерживается. Не поддерживаются только функции упаковки прямо в памяти.
Какие-то редкие функции/обратные вызовы могут не работать, т.к. я не тестировал их на своём наборе плагинов.


Техническая информация о поддерживаемых функциях:

Загрузчик экспортирует все функции WCX-интерфейса, что приводит к побочному эффекту: ТК думает, что плагин поддерживает всё. В частности, он вызывает только юникодные и расширенные функции (ReadHeaderExW, а не ReadHeaderEx или ReadHeader). Поэтому вызовы расширенных функций транслируются в вызовы реально поддерживаемых плагином функций, для неподдерживаемых функций возвращаются значения по умолчанию и ошибки.

Вызовы этих функций транслируются:
PackSetDefaultParams
PkSetCryptCallback
SetChangeVolProcW
SetChangeVolProc
SetProcessDataProcW
SetProcessDataProc
OpenArchiveW
OpenArchive
ReadHeaderExW
ReadHeaderEx
ReadHeader
ProcessFileW
ProcessFile
CloseArchive
PackFilesW
PackFiles
DeleteFilesW
DeleteFiles
GetPackerCaps
GetBackgroundFlags
ConfigurePacker
CanYouHandleThisFileW
CanYouHandleThisFile

Вызовы этих функций ещё не транслируются:
StartMemPackW
StartMemPack
PackToMem
DoneMemPack

Для тестирования всех функций нужен набор плагинов, экспортирующий все функции. Сейчас я использую:
1. MSI-Plus (неюникодный, экспортирует ReadHeader, дергает cbProcessDataProc каждые 1024 байта).
2. Total7zip (юникодный, экспортирует ReadHeaderExW, распаковывает в CloseArchive, поэтому вызывает cbProcessDataProc с отрицательными значениями, поддерживает фоновые операции, диалог настроек).
N. Думаю включить в набор плагин DiskDirExtended (неюникодный, экспортирует ReadHeaderEx).

Я не знаю плагинов, экспортирующих функцию PkSetCryptCallback.
Также я не знаю плагинов, реально вызывающих callback-функцкии из SetChangeVolProc.
Наконец, не помешал бы пример плагина, поддерживающего упаковку в памяти.


Last edited by MVV on Mon Oct 03, 2016 17:14; edited 8 times in total

#2: Re: [WCX] Wcx6432: 64-в-32-битный транслятор для WCX плагинов Author: Dec PostPosted: Tue Jun 14, 2016 13:20
    —
MVV wrote:
Wcx6432 позволяет использовать 32-битные WCX-плагины в 64-битном ТК.
Красавчик! Уделал меня. Smile

MVV wrote:
Как работает транслятор
Если не секрет, то как реализовал межпроцессорное взаимодействие?

MVV wrote:
Для тестирования всех функций нужен набор плагинов, экспортирующий все функции.
Я когда писал стой вариант, параллельно написал wcx плагин, который экспортировал все функции, его работу проверял в самом TC, а работу своего хоста проверял уже по своему плагину.

#3:  Author: LonerDLocation: Донецк PostPosted: Tue Jun 14, 2016 15:07
    —
Круто.
И сразу вопрос - в чём отличие от WCX to WCX64 Wrapper от Rico Elm? Пользуюсь его вариантом уже четыре года, порядка десятка плагинов через него подключены, проблем не наблюдаю.
И размеры, и метод работы схожие (переименовать заглушку и положить её в каталог с плагином).
Взял у автора исходники и доработал или решил с нуля написать свой вариант?

Планируются ли аналогичные решения для других типов плагинов? (wlx, wdx, wfx)

#4:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Jun 14, 2016 16:11
    —
Dec wrote:
Если не секрет, то как реализовал межпроцессорное взаимодействие?

Не секрет. Через именованный полнодуплексный канал. А ты в своём каким-то образом задействовал COM-маршалинг?

Dec wrote:
Я когда писал стой вариант, параллельно написал wcx плагин, который экспортировал все функции, его работу проверял в самом TC, а работу своего хоста проверял уже по своему плагину.

Не лишённая смысла мысль... У меня уже появлялась мысль допилить какой-нибудь опенсорсный плагин, добавив нужные функции.
Но одного плагина в любом случае будет мало, т.к. для проверки ВСЕХ функций нужно несколько плагинов (пример с ReadHeader/ReadHeaderEx/ReadHeaderExW в первом посте).

LonerD wrote:
И сразу вопрос - в чём отличие от WCX to WCX64 Wrapper от Rico Elm? Пользуюсь его вариантом уже четыре года, порядка десятка плагинов через него подключены, проблем не наблюдаю.
И размеры, и метод работы схожие (переименовать заглушку и положить её в каталог с плагином).
Взял у автора исходники и доработал или решил с нуля написать свой вариант?

Я помню, был такой, и ещё Гислер просил подождать и не публиковать его слишком рано, но где он сейчас?
Свой я писал с нуля, обсуждение на оффоруме подтолкнуло.

LonerD wrote:
Планируются ли аналогичные решения для других типов плагинов? (wlx, wdx, wfx)

Возможно, т.к. архитектура позволяет. А какие реально нужнее?
С листерными, правда, может быть посложнее, т.к. там идет взаимодействие с окнами. Хуже всего, когда плагин взаимодействует с тоталом в обход интерфейса (например, встраивается в оконную процедуру) - и тут, возможно, листерные будут грешить больше остальных.


Last edited by MVV on Tue Jun 14, 2016 16:43; edited 1 time in total

#5:  Author: Dec PostPosted: Tue Jun 14, 2016 16:20
    —
MVV wrote:
А ты в своём каким-то образом задействовал COM-маршалинг?
Хост приложение - обычный outproc COM сервер.

MVV wrote:
для проверки ВСЕХ функций нужно несколько плагинов (пример с ReadHeader/ReadHeaderEx/ReadHeaderExW в первом посте).
Не вижу проблем. Как я уже сказал, я писал простенький WCX плагин, который ничего полезного не делал, а просто отдавал содержимое фиксированной директории. При этом плагин реализовывал все функции. Нужно тестировать A-функции, комментирую в исходниках плагина W-экспорт, компилирую, получаю чистый A-плагин. Нужно тестировать W-функции, включаю в исходниках плагина W-экспорт, компилирую, получаю плагин с W-функциональностью.

#6:  Author: MVVLocation: Ростов-Дон PostPosted: Tue Jun 14, 2016 16:25
    —
А, комментировал и пересобирал, понятно. Smile


Эх, осознал, что общий клиентский модуль невозможен, придётся объединять Wcx6432.wcx64 и Wcx6432c.dll.

#7:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Jun 14, 2016 18:15
    —
MVV wrote:
А какие реально нужнее?

Каждому нужно что-то своё, но я бы прочих прочих равных условиях попросил следующими взять WFX.

#8:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Jun 15, 2016 00:50
    —
Решил я проблему нескольких одновременно загруженных плагинов, также добавил поддержку функций CanYouHandleThisFile/CanYouHandleThisFileW, теперь архивы с незарегистрированными расширениями тоже должны открываться.


Wcx6432 Beta 124

Теперь 4-й шаг больше не нужен и вообще никогда не существовал. Very Happy

Добавлено спустя 2 часа 32 минуты:

Добавил трансляцию вызовов всех callback-функций, правда, потестировал пока только с cbProcessDataProcW (только что-то у меня шкалы прогресса в тотале не заполнялись во время операции, хотя тотальные callback-функции вызывались с нормальными значениями: -1001, -1, -66, -100 и т.д.).

Wcx6432 Beta 140

#9:  Author: Dec PostPosted: Wed Jun 15, 2016 15:53
    —
На оффоруме человеки жалуются на скорость извлечения MsiPlus. Совпадение, но на этом плагине я изначально тестировал свою поделку. И на сколько я помню, этот плагин очень эмоционален, что проявляется в том, что он вызывает ProcessData callback каждые 8 извлеченных байт. И у меня межпроцессорные callback в таком количестве давали жуткие тормоза. Я сделал хак - в хосте я запоминаю момент последнего вызова callback, и вызываю реальный callback только если с момента предыдущего вызова прошло более 0,5 секунды, или изменилось имя, передаваемое в callback. Разумеется, используется некоторая магия с анализом и запоминанием и инкрементом переданного значения.

#10:  Author: MVVLocation: Ростов-Дон PostPosted: Wed Jun 15, 2016 16:56
    —
Я тоже подумываю над ограничением частоты, и накапливать надо обязательно ввиду особенностей колбека.

Жесть, конечно, если действительно каждые 8 байт... Там в тестовом архиве файл на 60 МБ.

Добавлено спустя 6 часа 30 минут:

Не, проверил - на каждые 1024 байта, что тоже мало радует. Smile

#11:  Author: Dec PostPosted: Wed Jun 15, 2016 23:37
    —
Наверное, я путаю с просто MSI, который не plus.

#12:  Author: MVVLocation: Ростов-Дон PostPosted: Thu Jun 16, 2016 03:22
    —
Доработал синхронизацию между процессами, потребление процессора значительно снизилось.
Также сократил число вызовов прогресс-функции, она вызывается не чаще, чем раз в полсекунды (на имена файлов не смотрю, раз в полсекунды - и точка, а то куча мелких файлов тормозить будет).
И добавил поддержку функции ConfigurePacker.

Wcx6432 Beta 160

#13:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jun 17, 2016 02:14
    —
Добавил поддержку упаковки и удаления файлов.

Wcx6432 Beta 172

Вопрос прогресс-баров по-прежнему не решён (callback-функция вызывается, но ничего не отображается).

#14:  Author: AvadaLocation: Россия, Саратов PostPosted: Fri Jun 17, 2016 07:47
    —
MVV
Проверял на старом (но порой всё ещё актуальном в моих условиях) плагине для ещё более старого архиватора HA. Упаковка не работает (сообщение об ошибке при упаковке).
Кроме того, прошу посмотреть, нельзя ли подружить эту методику с моторокеровким Recoder.


Last edited by Avada on Fri Jun 17, 2016 12:17; edited 1 time in total

#15:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jun 17, 2016 11:12
    —
Посмотрю, что можно сделать. Если WCX-интерфейс соблюдается, проблем быть не должно.



Total Commander -> Плагины Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3, 4  Next  :| |:
Page 1 of 4

Powered by phpBB © 2001, 2005 phpBB Group