Привет, хацкер! Надеюсь, и ты пользуешься
замечательным файловым менеджером 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

Что можно сделать с iPhone, зная пасскод. Как сливают данные, уводят iCloud и блокируют остальные устройства

Последние несколько месяцев мы много писали о нововведениях в iOS 11. «Теперь-то заживем!»…