Войти
Уголок tool-программСтатьи

О простейшем плагине к FAR для работы с файлами ресурсов

Автор:

версия документа: 0.91

Введение
Попытка обоснования необходимости плагина
Подготовка
Ссылки
Код

Введение

В данной статье описано как в кратчайшие сроки добавить в FAR поддержку работы с собственным файлом ресурсов.

Заметка будет полезна всем, кто хотел бы использовать привычный интерфейс для привычных действий.

Попытка обоснования необходимости плагина


Файлы ресурсов необходимы в силу того, что в идеале они удобнее в работе, позволяют производить защиту данных, более эффективно взаимодействовать с файловой подсистемой.

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

Однако бывает удобно тестировать более менее готовый файл ресурсов (добавляя/убавляя из него периодически информацию) и пересобирать его каждый раз только из-за этого не представляется эффективным. Естественно, такой подход ведёт к возможно неоптимальному хранению данных в процессе работы, но собственно ничего не мешает пересобрать с оптимизацией получившийся файл один раз на предрелизной стадии.

Подготовка

Перед тем как строить плагин выдвинем постулаты:

1.Есть хорошо нами понимаемый формат файла ресурсов.

2.Существуют средства работы с ним, в том числе библиотека поддержки и утилита сборки.

Первый постулат означает - мы понимаем,  что собираемся делать. Второй означает наличие средств доступа к ресурсам (средства подразумеваются низкоуровневые в том плане, что у них отсутствует напрочь приятный графический пользовательский интерфейс)

Мы пойдём самым-самым лёгким путём и будем интегрироваться в FAR посредством плагина MultiArc, который создан именно для того чтобы организовывать работу с различными архивами (читай - файлами ресурсов) с наименьшими затратами на создание плагинов. MultiArc входит в стандартную поставку FAR 1.70.

Наша задача скомпилировать динамическую библиотеку, которая будет экспортировать определённые функции и положить библиотеку в нужное время, в нужное место, с нужным расширением. Эта библиотека будет запускать внешнюю утилиту для выполнения всех операций по работе с файлом ресурсов.

Для компиляции понадобится включить в проект файлы fmt.hpp и plugin.hpp поставляемые опять же с FAR. Выходной файл должен иметь расширение не dll, а fmt. Для экспортируемых функций важно не перемудрить с декорацией экспортируемых символов. Рекомендую также при линковке библиотеки указать нестандартный базовый адрес загрузки, дабы избежать лишних операций при загрузке MultiArc. Полученный плагин следует поместить в %FAR%\Plugins\Multiarc\Formats, где %FAR% - директория, в которую установлен FAR.

Необходимо экспортировать следующие функции (более подробно о работе с ними  и параметрах можно узнать из документации и анализа кода приводимого ниже примера):

IsArchive() - вызывается MultiArc для проверки, является ли файл понимаемым нами файлом ресурсов. В частности, очень полезно, когда файл имеет нестандартное расширение.

OpenArchive() - вызывается при открытии файла ресурсов.

GetArcItem() - вызывается для получения данных следующего элемента файла ресурсов. Фактически самым важными будут являться полное имя файла в файле ресурсов и размер. Остальное -  по желанию.

CloseArchive() - вызывается для закрытия файла ресурсов.

GetSFXPos() - возвращает смещение на начало данных архива в файле.

GetFormatName() - сообщает стандартное расширение файла ресурсов и его описание.

GetDefaultCommands() - используется для получения командных строк запуска внешней утилиты, которая умеет изменять данные файла ресурсов. В качестве параметров в эти строки можно передавать множество различных шаблонов подстановки, в частности:

%%A - Имя архива.
%%W - Папка для временных файлов, включая завершающую косую черту.
%%R - Текущая папка в архиве.
%%L - Имя списка файлов. Список файлов - это файл, содержащий имена
      файлов, предназначенных для обработки внешним архиватором.
%%F - Имена одного или нескольких файлов для обработки. 
Те же буквы в нижнем регистре дают краткие имена файлов.

Также в командах применяются модификаторы переменных (приведена лишь часть):

    Q - заключать имена с пробелами в кавычки;
    S - использовать '/' вместо '\' в путях файлов;
    M - передавать имена папок архиваторам как 'имя\*.*';
    N - передавать имена папок архиваторам как 'имя';
    W - использовать только имя без пути;
Эти модификаторы могут быть использованы сразу же после переменных без пробелов, например: %%fQ.

Если часть командной строки заключена в фигурные скобки, то она будет добавлена к итоговой строке, подаваемой на вход утилиты, лишь в том случае, если в ней содержится хотя бы одна непустая переменная.

Если внешняя утилита не поддерживает какую-либо команду, соответствующую  строку оставляем пустой.

Итак, порядок выполнения примерно такой:

1. Пользователь нажимает ENTER на необходимом файле.

2. Если этот этап произошёл впервые за сеанс работы с FAR, MultiARC загружает плагины второго уровня (плагины к плагину :) ) в память, проверяет наличие у него экспортируемых функций и если всё хорошо, получает информацию о поддерживаемых файлах и командных строках для работы с файлом.

3. Запускается IsArchive() чтобы удостовериться, что файл действительно в том формате, что и должен быть. Если расширение файла неизвестно, эта функция используется для поиска плагина, который узнал в файле свой формат.

4. У GetSFXPos() запрашивается начало данных. Используется в ситуации когда архивы вложены друг в друга и несколько плагинов сообщают, что узнали свой формат. В таком случае выбирается тот, начало данных которого раньше.

5. Файл открывается OpenArchive()

6. Вызывается до тех пор, пока вызывается GetArcItem()

7. Файл закрывается CloseArchive()

8. Пользователь инициирует какое-либо действие (например, просмотр файла), запускается внешняя утилита, которая и достаёт данные необходимого файла.

Как видим, делать в общем-то совсем нечего. Поэтому сразу перейдём к реализации.

Ссылки

Всю необходимую информацию можно получить из документации, поставляемой с FAR'ом.

Список параметров, которые могут передаваться утилитам, запускаемым через MultiArc, можно просмотреть использовав чит-код: F1, Shift-F2, "Модуль работы с архивами", "Командные строки архиваторов"

Страницы: 1 2 Следующая »

27 февраля 2006 (Обновление: 28 фев. 2006)

Комментарии [2]