Привет, хацкер! Надеюсь, и ты пользуешься
замечательным файловым менеджером Far,
написанным Eugene Roshal. Вот и напишем к нему
простой плагин. Плагин к Far — обычная DLL с
определённым набором экспортных функций.
Инсталляция происходит элементарно —
копируем DLL в каталог Far\Plugins и перезапускаем
Far. Вызов плагина — F11 (“Команды внешних
модулей”), потом “CD-ROM Functions”. После выбора
этого плагина появится подменю (“Open CD/Close CD”).
Наш плагин-пример будет просто выдвигать/задвигать
“язык” сидюка. 

А вот и исходник — проще некуда 🙂

//————-
#include <windows.h>
#include <mmsystem.h>
#pragma argsused
//————-
#include "plugin.hpp" // Этот заголовочный файл
берётся из ..\Far\PlugDoc.rar

/*
Структура PluginStartupInfo должна быть в каждом
plug-in’e
Far использует её для получения информации о
модуле и
передачи информации в модуль.
*/
static struct PluginStartupInfo Info;

/* Экспортируемые функции */
extern "C"
{
/* Вызывается Far’ом для заполнения структуры
PluginStartupInfo. */
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info);
/* Главная функция плагина — вызывается при
выборе плагина из списка,
который появляется при нажатии F11. */
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item);
/* Вызывается Far’ом для получения информации
о плагине.
Экземпляр структуры PluginInfo создаётся Far’ом, а
её адрес передаётся в GetPluginInfo. */
void WINAPI _export GetPluginInfo(struct PluginInfo *Info);
}
//————-
/* Задаём пункты меню */
struct FarMenuItem MenuItems[2] =
{
{"Open CD", /* Название пункта */
0, /* Признак того, что пункт выбран */
0, /* Если не 0 — слева ставится "галочка" —
(что-то вроде RadioGroup) */
0 /* Если не 0 — вместо пункта меню
ставится разделитель */
},
{"Close CD",
0,
0,
0
}
};
//————-
void WINAPI _export SetStartupInfo (struct PluginStartupInfo *Info)
{
::Info = *Info; /* Просто передаём указатель на
нашу структуру,
чтобы Far знал где она лежит */
}
//————-
void WINAPI _export GetPluginInfo(struct PluginInfo *Info)
{
Info->StructSize = sizeof(*Info);

static char *PluginMenuStrings[1];
PluginMenuStrings[0] = "CD-ROM Functions"; /* Название
плагина */

/* Добавляем пункт в меню, которое
появляется при нажатии F11 */
Info->PluginMenuStrings = PluginMenuStrings;
Info->PluginMenuStringsNumber = 1; /* Добавили одну строку
*/
}
//————-
HANDLE WINAPI _export OpenPlugin(int OpenFrom, int Item)
{
/* Вызываем меню и узнаём номер выбранного
пункта */
int menu_item = Info.Menu (Info.ModuleNumber,
-1, // X — Default
-1, // Y — Default
0, // MaxHeight — Default
FMENU_AUTOHIGHLIGHT, /* Автоподсветка
при выборе*/
"CD-ROM Menu", /* Заголовок меню */
"Choose something", /* Строка снизу */
NULL, /* Ссылка на Help — его нет 🙂 */
NULL, /* BreakKeys — по умолчанию нет */
NULL, /* BreakCode — см. пред. пункт. */
&MenuItems[0], /* Адрес структур
с пунктами меню */
2 /* Количество пунктов в меню */
);

switch(menu_item) /* в зависимости от номера
выбранного пункта… */
{
case 0: /* Выдвигаем подставку для чашки с кофе
🙂 */
mciSendString("Set CDAudio Door Open", 0, 0, 0);
break;
case 1: /* Задвигаем подставку для чашки с кофе
🙂 */
mciSendString("Set CDAudio Door Closed", 0, 0, 0);
break;
}

/* Вообще-то здесь надо возвращать Handle plugin’a,
но всё и так прекрасно работает :))) */
return(INVALID_HANDLE_VALUE);
}
//————-
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//————-

В принципе, при небольшой доделке исходника
можно написать свой проигрыватель CD с
управлением из Far’a (надо только не
полениться и посмотреть в MSDN функции winAPI по
управлению сидюком — играть, следующая
дорожка, и т.д. — мне было лень :)). Да, кстати, в
архиве PlugDoc.rar лежит файл plugins.hlp — описание
функций и структур плагина, которые
обеспечивают интерфейс с Far’ом. 

P.S. Far находит плагин автоматически,
просматривая все DLL в подкаталоге Plugins и
автоматически выполняя в каждой функцию
GetPluginInfo (если такую найдёт), при этом плагин
не обязательно должен появляться в меню
внешних модулей. Ну, ты меня понял 😉

Оставить мнение

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…