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

Phoenix

Важко знайти людину, що не знає або не використовує Far – IMHO найкращий клон NC для Windows. Крім того, що це просто дуже хороший файл менеджер, до нього є величезна кількість plug-in модулів. Plug-in модуль це DLL-файл, який замість стандартних Windows функцій по роботі з монітором, клавіатурою і т.д. звертається до функцій Far-а. Far підтримує весь набір функцій для роботи в текстовому режимі. Установка plug-in модуля відбувається гранично просто – DLL файл і файли даних копіюються в каталог в каталозі Far \ Plugins і 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 <stdio.h> / / для виклику sprintf
# Include <windows.h> / / для функцій 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); / / зробимо рядок
strcpy (MenuItems [i + +]. Text, o); / / скопіюємо цю строчку в масив MenuItems
}
}


/ / Викликаємо створене нами меню, отримуємо номер обраного пункту – 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);
}

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


Phoenix aka Руслан Ільгасов, Москва
E-Mail:

phoenixbird@hotmail.ru


FIDO: 2:5020/2637.2

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


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

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

Ваш отзыв

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

*

*