Як самому зробити plug-in до FAR на Visual C + + h2>
Важко
знайти людину, що не знає або не використовує Far - IMHO найкращий клон NC
для Windows. Крім того, що це просто дуже хороший файл менеджер, до нього
є величезна кількість plug-in модулів. Plug-in модуль це DLL-файл, який
замість стандартних Windows функцій по роботі з монітором, клавіатурою і т.д.
звертається до функцій Far-а. p>
Far
підтримує весь набір функцій для роботи в текстовому режимі. Установка
plug-in модуля відбувається гранично просто - DLL файл і файли даних копіюються
в каталозі в каталозі FarPlugins і Far перезапускається. p>
FAR
поширюється з повним набором файлів для написання самим plug-in на будь-якому З
компіляторі для Windows. Темою цієї статті є написання цих модулів
самим на Visual C + + (я використовував Visual C + + 5.0). При установці в каталог Far
копіюється PlugDoc.rar, у ньому є приклади plug-in-ів і header файл. Всі
приклади використовуються Ще там є VCReadme.txt, в якому описуються тонкощі
роботи з Visual C + +. Потім поразбіраетесь з прикладами. P>
Ми
з вами напишемо plug-in, який отримує список відкритих вікон Windows, він може
стати в нагоді як заготівля для своїх. І взагалі - варто почати - все це не так
складно, як можна подумати. Ось, а тепер - поїхали: p>
1)
Запускає VC, робимо новий проект типу "Win32 Dynamic-Link Library"
на ім'я SimpleFP. Створює файл simplefp.cpp - тут, власне, ми й будемо
писати. До каталогу SimpleFP копіюємо header файл plugin.hpp з архіву
PlugDoc.rar. P>
2)
Тепер нам треба зробити. Def файл - це файл, в якому описуються функції,
які викликаються з зовнішніх модулів. Ми повинні описати функції Far-а, які
ми будемо використовувати в нашому модулі. Робимо текстовий файл simplefp.def, в
якому пишемо: p>
LIBRARY p>
EXPORTS p>
GetPluginInfo = _GetPluginInfo @ 4 p>
OpenPlugin = _OpenPlugin @ 8 p>
SetStartupInfo = _SetStartupInfo @ 4 p>
Тут
ми описуємо 3 функції, які нам знадобляться. А тепер додамо simpledef.def до файлів проекту
(Project - Add to project - Files - simplefp.def). P>
3)
Тепер пишемо сам plug-in - працюємо з файлом simplefp.cpp. Я вирішив дати текст
самої програми з коментарями - можна скопіювати в С + + і почати з ним
возитися. Але спочатку про засадах. P>
Far
працює за тими ж принципами, що і Windows - ви посилаєтеся у програмі на ті
функції, що вже є в системі, які хочете використовувати. Far
надає функції для роботи з екранними формами в режимі console
application. При запуску plug-in-а Far запускає функцію OpenPlugin, ми будемо
її розглядати як аналог main () або WinMain (). Але крім цього треба ще
повідомити Far-у дані про наш plug-in-е. Це робить функція GetPluginInfo. P>
/* p>
*
SimpleFP - простий plug-in до Far-у. (С) 2000
Phoenix, Moscow p>
*/ p>
# include// для виклику sprintf p>
# include// для функцій Windows p>
# include "plugin.hpp"// для функцій Far p>
# define PLUGIN_NAME "Open
windows "//Назва
plug-in-а p>
# define
WINDOW_HEAD "Open windows list"// Заголовок меню, яке ми зробимо p>
// p>
//
Описуємо функції Far, які з якими ми працюємо. P>
// p>
extern "C" p>
( p>
void WINAPI _export
SetStartupInfo (struct PluginStartupInfo * Info); p>
HANDLE WINAPI _export OpenPlugin (int
OpenFrom, int Item); p>
void WINAPI _export
GetPluginInfo (struct PluginInfo * Info); p>
); p>
static struct PluginStartupInfo
Info;// Інформація про наш plug-in-е p>
// p>
//
Інформація про модуль визначена нами в структурі Info p>
// p>
void WINAPI _export
SetStartupInfo (struct PluginStartupInfo * Info) p>
( p>
:: Info =* Info; p>
) p>
//
Ця функція викликається для отримання інформації про plug-in. P>
//
Ми повинні заповнити поля структури Info. P>
// p>
void WINAPI _export
GetPluginInfo (struct PluginInfo * Info) p>
( p>
Info-> StructSize = sizeof (* Info);
//Розмір структури Info p>
Info-> Flags = 0;
//Це нам не потрібно p>
Info-> DiskMenuStringsNumber = 0;
//Це нам теж не потрібно p>
//
Визначаємо рядок з назвою модуля p>
static
char * PluginMenuStrings [1]; p>
PluginMenuStrings [0] = PLUGIN_NAME; p>
// Визначаємо назва plug-in модуля p>
Info-> PluginMenuStrings = PluginMenuStrings; p>
Info-> PluginMenuStringsNumber = sizeof (PluginMenuStrings)/sizeof (PluginMenuStrings [0 ]); p>
Info-> PluginConfigStringsNumber = 0;
//Це нам не потрібно p>
) p>
//
Ця функція викликається при запуску plug-in модуля. P>
// p>
HANDLE WINAPI _export OpenPlugin (int
OpenFrom, int Item) p>
( p>
HWND
hwnd;// Використовуємо для отримання handle p>
char
p [128], o [128];// Для створення рядків меню p>
int
i = 0;// Лічильник p>
struct
FarMenuItem MenuItems [64];// Опис меню, яке створить для нас Far p>
memset (MenuItems, 0, sizeof (MenuItems));
//Ініціалізіруем наше меню p>
MenuItems [0]. Selected = TRUE; p>
hwnd = GetDesktopWindow ();// Отримуємо handle для desktop p>
hwnd = GetWindow (hwnd, GW_CHILD);//
Отримуємо його handle p>
while
(hwnd! = 0)// Поки воно не останнє p>
( p>
hwnd = GetWindow (hwnd, GW_HWNDNEXT);
//Отримаємо handle вікна p>
GetWindowText (hwnd, p, 128);
//І його заголовок p>
if
(strlen (p)> 0)// якщо заголовок є p>
( p>
sprintf (o, "% 0.8xld
% s ", hwnd, p);// зробимо рядок p>
strcpy (MenuItems [i + +]. Text,
o);// скопіюємо цю строчку в масив MenuItems p>
) p>
) p>
//
викликаємо створене нами меню, отримуємо номер обраного пункту - MenuCode p>
// p>
int
MenuCode = Info.Menu (Info.ModuleNumber, p>
-1, -1,0, p>
FMENU_AUTOHIGHLIGHT | FMENU_WRAPMODE, p>
WINDOW_HEAD, p>
NULL, p>
"Menu content", p>
NULL, p>
NULL, p>
MenuItems, p>
i); p>
return (INVALID_HANDLE_VALUE); p>
) p>
компілюється,
копіюйте в FarPlugin і перезапускати Far. У Far-е натисніть F11 - це список
plug-in модулів. Тепер у ньому має з'явитися рядок Open windows. Подивіться
на результат. Тепер можна розвивати, наприклад - обробляючи результат MenuCode
посилати вибраного вікна повідомлення WM_CLOSE, або зробити ще що-небудь
нетривіальне:) Створення plug-in модулів до Far-у документована чудово,
розбирайтеся. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://www.soch.imperium.by
p>