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