Что такое "плагины"? Как говорит Википедия - это "независимо компилируемый программный модуль, динамически подключаемый к основной программе и предназначенный для расширения и/или использования её возможностей". Применительно к Far Manager так оно и есть - множество полезных функций (обзор сети, временная панель, "гляделка" процессов, просмотр изображений и т.п.) выполнено как плагины.
Почему именно "плагины", а не прямая компиляция функционала в ядро Far Manager? Здесь все просто и вытекает из определения термина "плагин" - я хочу вот эту фишку в редакторе, а соседу она будет лишней. Ок, я ставлю плагин, добавляющий эту фишку, а сосед пусть "мучается" - при этом ему хорошо, я доволен и вместе мы не перегружаем исходный код Far Manager "ненужными" функциями.
А что делать, если этой самой функции нигде нет? Здесь три пути:
- написать плагин самому
- найти (и убедить в нужности функционала) того, кто нам напишет такой плагин
- смириться (или становимся программистом и далее путь 1)
Собираем материал.
Итак, цель есть - простой и понятный плагин, вызов которого приветствует пользователя фразой "Здравствуй, Мир!". Остались вопросы:
- Какой минимальный набор функций, чтобы Far Manager понял, что наша dll - плагин?
- Интерфейс может быть на другом языке, отличным от начертания "Здравствуй, Мир!". Как сделать мультиязычный интерфейс?
- Каким образом Far Manager вообще работает с плагинами?
- Какие файлы входят в проект?
Прежде чем двигаться дальше, посмотрим, что делает Far Manager от момента запуска до приема команд от пользователя.
- Пользователь запускает Far Manager.
- Far Manager настраивает свое окружение (инициализация глобальных переменных, конфигурационных баз, панелей и прочих объектов интерфейса).
- Загружает плагины.
- Загружает макросы.
- Запускает основной цикл обработки и показывает панели.
Для известных путей происходит сканирование файловой структуры на наличие файлов "*.dll".
Очередной найденный dll-модуль проверятся на предмет принадлежности в текущей OS, на наличие предопределенных экспортируемых функций (пока GetGlobalInfoW).
.
.
.
Минимальный набор функций.
Весь набор экспортируемых функций, которые понимает Far Manager и ожидает от плагина, можно подсмотреть в конце файла plugin.hpp. Но чтобы плагин "взлетел", понадобится следующий минимальный набор экспортируемых функций:
- GetGlobalInfoW - Основная информация о плагине - автор, версия, GUID плагина, описание плагина, минимальная версия Far Manager. Функция вызывается один раз сразу после загрузки DLL-модуля в память.
- SetStartupInfoW - Вызывается один раз, сразу после вызова функции GetGlobalInfoW. Far Manager передаёт плагину информацию, необходимую для дальнейшей работы (указатели на сервисные и некоторые полезные внутренние функции Far Manager).
- GetPluginInfoW - Far Manager вызывает эту функцию для получения дополнительной информации о плагине (из какого места можно вызвать плагин, префикс(ы), строки для разных меню вызова).
- OpenW - Far Manager вызывает OpenW, когда пользователь желает воспользоваться функциями плагина. Здесь мы реализовываем основной функционал.
Состав проекта.
В проекте будут следующие файлы:
- README.TXT - Описание плагина. Что, зачем и почему. Пользователь всегда хочет знать подробности.
- changelog - Что менялось в проекте от версии к версии. Файл опциональный, но полезный.
- guid.hpp - GUID`ы плагина, меню, диалогов.
- HelloWorld.cpp - "Ядро" системы. Т.к. описываемый плагин простой, то весь код разместим в одном файле.
- HelloWorld.hpp - Локальные функции и определения проекта. Опционально, если весь код в одном файле.
- HelloWorld.rc - Ресурсы. Версия dll-модуля
- HelloWorld*.hlf - Файлы справки на разных языках. Опционально, но полезно - пользователю можно сказать "жми F1 и читай". Можно повторить содержимое README.TXT.
- HelloWorld*.lng - Языковые ресурсы - строки, которые плагин показывает пользователю (в меню, диалогах, и пр.).
- HelloWorldLng.hpp - Содержит константы, определяющие строковые ресурсы в lng-файлах.
- HelloWorldW.def - Показывает сборщику, какие функции экспортирует dll-модуль.
- makefile - Файл, содержащий правила сборки плагина (правила, которые понимает команда make.exe и аналогичные).
- version.hpp - Содержит константы, описывающие версию плагина. Константы используются как в rc-файле, так и в функции GetGlobalInfoW.
Для корректного отображения языкозависимых строк плагину достаточно выполнить несколько требований:
- Держать строки в файлах *.lng
- Вызывать нужные строки по номеру с помощью АПИ-функции PluginStartupInfo::GetMsg
Функционал.
...
PluginRinG.
Чтобы наше творение заметили и оценили, воспользуемся услугами централизованного хранилища плагинов - PlugRinG.
Для этого необходимо запаковать набор файлов по следующим правилам:
...