Як самому зробити plug-in до FAR на Visual C + +, Різне, Програмування, статті

Важко знайти людину, що не знає або не використовує Far – IMHO найкращий клон NC для Windows. Крім того, що це просто дуже хороший файл менеджер, до нього є величезна кількість plug-in модулів. Plug-in модуль це DLL-файл, який замість стандартних Windows функцій по роботі з монітором, клавіатурою і т.д. звертається до функцій Far-а. Far підтримує весь набір функцій для роботи в текстовому режимі. Установка plug-in модуля відбувається гранично просто – DLL файл і файли даних копіюються в каталог в каталозі FarPlugins і Far перезапускається. FAR поширюється з повним набором файлів для написання самим plug-in на будь-якому С компіляторі для Windows. Темою цієї статті є написання цих модулів самим на Visual C++ (Я використовував Visual C + + 5.0). При установці в каталог Far копіюється PlugDoc.rar, в ньому є приклади plug-in-ів і header файл. Всі приклади використовуються Ще там є VCReadme.txt, в якому описуються тонкощі роботи з Visual C++. Потім порозбирали з прикладами.

Ми з вами напишемо plug-in, який отримує список відкритих вікон Windows, він може стати в нагоді як заготівля для своїх. І взагалі – варто почати – все це не так складно, як можна подумати. Ось, а тепер – Поїхали:


1) Запускає VC, робимо новий проект типу “Win32 Dynamic-Link Library” по імені SimpleFP. Створює файл simplefp.cpp – тут, власне, ми і будемо писати. У каталог SimpleFP копіюємо header файл plugin.hpp з архіву PlugDoc.rar.


2) Тепер нам треба зробити. Def файл – це файл, в якому описуються функції, які викликаються із зовнішніх модулів. Ми повинні описати функції Far-а, які ми будемо використовувати в нашому модулі. Робимо текстовий файл simplefp.def, в якому пишемо:

LIBRARY
EXPORTS
GetPluginInfo=_GetPluginInfo@4
OpenPlugin=_OpenPlugin@8
SetStartupInfo=_SetStartupInfo@4

Тут ми описуємо 3 функції, які нам знадобляться. А тепер додамо simpledef.def до файлів проекту (Project – Add to project – Files – simplefp.def).


3) Тепер пишемо сам plug-in – працюємо з файлом simplefp.cpp. Я вирішив дати текст самої програми з коментарями – можна скопіювати в С + + і почати з ним возитися. Але спочатку про основах.


Far працює за тими ж принципами, що і Windows – ви посилаєтеся в програмі на ті функції, вже наявні в системі, які хочете використовувати. Far надає функції для роботи з екранними формами в режимі console application. При запуску plug-in-а Far запускає функцію OpenPlugin, ми будемо її розглядати як аналог main () або WinMain (). Але крім цього треба ще повідомити Far-у дані про наше plug-in-е. Це робить функція GetPluginInfo.

/*
* SimpleFP – простий plug-in до Far-у. (С) 2000 Phoenix, Moscow
*/

# Include / / для виклику sprintf
# Include / / для функцій Windows
# Include “plugin.hpp” / / для функцій Far
# Define PLUGIN_NAME “Open windows” / / Назва plug-in-а
# Define WINDOW_HEAD “Open windows list” / / Тема меню

//
/ / Описуємо функції Far, які з якими ми працюємо.
//
extern “C” {
void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info);
HANDLE WINAPI _export OpenPlugin(int OpenFrom,int Item);
void WINAPI _export GetPluginInfo(struct PluginInfo *Info);
};

static struct PluginStartupInfo Info; / / Інформація про наш plug-in-е
//
/ / Інформація про модуль визначена нами в структурі Info
//

void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info) {
::Info=*Info;
}

/ / Ця функція викликається для отримання інформації про plug-in.
/ / Ми повинні заповнити поля структури Info.
//
void WINAPI _export GetPluginInfo(struct PluginInfo *Info) {
Info-> StructSize = sizeof (* Info); / / Розмір структури Info
Info-> Flags = 0; / / Це нам не потрібно
Info-> DiskMenuStringsNumber = 0; / / Це нам теж не потрібно

/ / Визначаємо рядок з назвою модуля
static char *PluginMenuStrings[1];
PluginMenuStrings[0]= PLUGIN_NAME;
/ / Визначаємо назву plug-in модуля

Info->PluginMenuStrings=PluginMenuStrings;
Info->PluginMenuStringsNumber=sizeof(PluginMenuStrings)/
sizeof(PluginMenuStrings[0]);
Info-> PluginConfigStringsNumber = 0; / / Це нам не потрібно
}

/ / Ця функція викликається при запуску plug-in модуля.
//
HANDLE WINAPI _export OpenPlugin(int OpenFrom,int Item) {
HWND hwnd; / / Використовуємо для отримання handle
char p [128], o [128]; / / Для створення рядків меню
int i = 0; / / Лічильник
struct FarMenuItem MenuItems [64]; / ​​/ Опис меню, яке
/ / Створить для нас Far
memset (MenuItems, 0, sizeof (MenuItems)); / / Ініціалізували наше меню
MenuItems[0].Selected=TRUE;
hwnd = GetDesktopWindow (); / / Отримуємо handle для desktop
hwnd = GetWindow (hwnd, GW_CHILD); / / Отримуємо його handle
while (hwnd! = 0) {/ / Поки воно не останнє
hwnd = GetWindow (hwnd, GW_HWNDNEXT); / / отримаємо handle вікна
GetWindowText (hwnd, p, 128); / / і його заголовок
if (strlen (p)> 0) {/ / якщо заголовок є
sprintf (o, “% 0.8xld% s”, hwnd, p); / / зробимо сходинку
/ / Скопіюємо цю строчку в масив MenuItems
strcpy(MenuItems[i++].Text, o);
}
}
/ / Викликаємо створене нами меню, отримуємо номер обраного
/ / Пункту – MenuCode
//
int MenuCode=Info.Menu(Info.ModuleNumber,
-1,-1,0,
FMENU_AUTOHIGHLIGHT/FMENU_WRAPMODE,
WINDOW_HEAD,
NULL,
“Menu content”,
NULL,
NULL,
MenuItems,
i);
return(INVALID_HANDLE_VALUE);
}


Компілюйте, копіюйте в FarPlugin і Перезапускайте Far. В Far-е натисніть F11 – це список plug-in модулів. Тепер в ньому повинна з’явитися рядок Open windows. Подивіться на результат. Тепер можна розвивати, наприклад – обробляючи результат MenuCode посилати вибраному вікну повідомлення WM_CLOSE, або зробити ще що-небудь нетривіальне 🙂 Створення plug-in модулів до Far-у документована чудово, розбирайтеся.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*