• Партнер

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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии