• Главная
  • Карта сайта
Не найдено

Плагін своїми руками

Функціональність програм часто можуть покращувати не тільки їх безпосередні розробники, а й інші люди. Вони, як правило, є користувачами тих програм, які хочуть поліпшити. Можливо це в тих випадках, коли програма підтримує різні доповнення. Доповнення ці зазвичай реалізуються у вигляді плагінів.


Що таке плагіни?

Звичайно, можливі всякі варіації, але зазвичай під плагіном розуміється якась динамічно компонованих бібліотека (DLL - Dynamic Link Library) спеціального формату, яка завдяки знаходяться в ній функцій розширює можливості "батьківського" додатка. Звичайно, в широкому сенсі слова під плагінами можна розуміти не тільки DLL'кі, а, наприклад, і такі комплексні речі, як доповнення до Mozilla Firefox. Але зазвичай плагін - це саме спеціальна динамічна бібліотека.

Чим же ця динамічна бібліотека така вся з себе спеціальна? Вся справа в тому, які функції вона експортує. Щоб додаток могло завантажити цю бібліотеку і використовувати що містяться в ній функції, йому повинен бути відомий їх вид - в общем-то, це завжди так з динамічної компонуванням. Тому всі плагіни для однієї програми мають однакові імена і формати функцій, використовуваних в додатку. Звичайно, серед експортованих функцій можуть бути і інші, але тоді питається, навіщо вони там потрібні.

Універсального формату плагінів, який підходив би всім додаткам, не існує. Причина цього проста: дуже різні функції виконують різні програми, і було б дивно користуватися плагінами до Adobe Photoshop з Sound Forge. Але, тим не менш, свої стандарти є, а тому додатки, що виконують схожі функції, часто "розуміють" плагіни своїх конкурентів. Наприклад, серед графічних додатків стандартом де-факто стали вже згадувані плагіни до Photoshop, а серед додатків для роботи зі звуком поширений формат VST.


Які плагіни писати?

Плагін часто включає в себе таку силу-силенну складних речей, що його можна вважати самостійним програмним продуктом. В першу чергу, це відноситься до професійних плагінів для складних програм - наприклад, до того ж 3D Studio MAX. Щоб створювати такі плагіни, потрібна не тільки висока програмістська кваліфікація розробника, але і хороші знання в тій області, в якій працює програма. Як правило, над графічними і звуковими фільтрами працюють команди з кількох людей, і велика частина часу витрачається не на написання коду, а на математичне моделювання перетворень, реалізованих в плагіні.

Але для деяких програм плагіни можна писати і не будучи докою по частині ефектів Photoshop і гармонійного аналізу. Безліч ентузіастів пише свої плагіни до популярних призначеним для користувача програмам - таким, як відома програма для миттєвого обміну повідомленнями Miranda. Відверто кажучи, "Мірандою" без плагінів взагалі користуватися досить-таки важко. Щоб написати свій плагін для неї, часто достатньо знань школяра, який цікавиться програмуванням, та й взагалі будь-якої людини, для якого програмування - не основна робота, а просто хобі.

Щоб продемонструвати вам основні принципи написання плагінів на практиці, я розповім, як написати власний повнофункціональний плагін для популярного файлового менеджера Total Commander. Чому саме для нього? Тому що писати до нього плагіни досить просто, а сам Total Commander я вважаю кращою з програм цього класу.


Отже, пишемо?

Писати плагіни можна на будь-якій мові програмування, код на якому можна скомпілювати і скомпонувати в динамічну бібліотеку. Але зараз для простоти і наочності я буду користуватися Delphi, оскільки з цією мовою може працювати практично кожен, хто в школі навчився Паскалю. Та й сам Total Commander, як відомо, написаний саме на Delphi.

Модулі до "Командиру" бувають різні. Дуже різні, я б навіть сказав. Всього їх, на сьогоднішній день, чотири типи: плагіни вбудованого архіватора, плагіни вбудованого переглядача (Lister'а), розширення файлової системи і контент-плагіни. Модулі для архіватора дозволяють працювати через Total Commander з новими форматами архівів як зі звичайними папками, плагіни Lister'а дозволяють переглядати після натискання на кнопку F3 файли нових форматів. Модулі файлової системи дозволяють працювати зі структурованими сховищами даних як зі звичайними каталогами та файлами, що лежать на диску. В принципі, вони чимось схожі на архівні плагіни. Контент-плагіни з'явилися в Total Commander'е порівняно недавно, починаючи з версії 6.50 (на момент написання статті найновішою була версія 7.01). Вони дозволяють відображати додаткову інформацію про різних файлах в головному вікні програми.

Природно, різні види плагінів мають різні принципи роботи і різну внутрішню структуру. Тому для подальших дій варто визначитися з тим, який саме плагін ми з вами будемо писати. Всі плагіни гарні, але особисто мені здається, що краще за все показати на прикладі плагін для Lister'а, тому що всі формати файлів не перерахуєш, та й нові постійно з'являються. Загалом, написання плагінів до Lister'у - корисний практичний навик, який може стати в нагоді в житті.

Щоб особливо не мучитися з ідеєю для нашого плагіна, будемо писати плагін для показу RTF-файлів. Хоч "Командир" це вміє і без того, зараз наша мета - навчитися, а не створити щось вражає уяву.


Отже, пишемо!

Для того, щоб писати плагін, потрібна спочатку деяка попередня підготовка. Для початку, напевно, непогано б встановити Delphi. Якщо вона вже встановлена, то видаляти і ставити по-новому не треба. Крім самої Delphi, потрібні заголовки, щоб експортувати правильні функції і знайти, таким чином, спільну мову з Total Commander'ом. Завантажити їх потрібно з сайту Total Commander'а ( ghisler.com/plugins.htm ), Називається це "LS-Plugin writer's guide". Пряме посилання така: ghisler.fileburst.com/lsplugins/listplughelp1.5.zip , Але вона, як бачите, містить в собі номер версії, який може змінитися.

Ну ось, якщо ви все завантажили, то можна переходити безпосередньо до дій. Запустіть середу Delphi і у вікні створення нового проекту виберіть "DLL" (в деяких версіях Delphi це називається "DLL Wizard", але це не принципово: головна ідея така, що проект повинен бути проектом динамічно компонованих бібліотеки).

Запустіть середу Delphi і у вікні створення нового проекту виберіть DLL (в деяких версіях Delphi це називається DLL Wizard, але це не принципово: головна ідея така, що проект повинен бути проектом динамічно компонованих бібліотеки)

Один невеликий нюанс: оскільки типів плагінів до TC кілька, їм усім прийнято давати різні розширення. Модулі для Lister'а традиційно мають розширення WLX. Тому краще заздалегідь змінити розширення вихідного файлу в настройках проекту.

У розділі uses головного файлу проекту потрібно додати модулі Windows, оскільки нам знадобляться деякі типи даних звідти для експорту функцій нашим плагіном. Всього ж функцій, які нам необхідно експортувати, три. Ось як вони виглядають:

function ListLoad (ParentWin: thandle; FileToLoad: pchar; ShowFlags: integer): thandle; stdcall; procedure ListCloseWindow (ListWin: thandle); stdcall; procedure ListGetDetectString (DetectString: pchar; maxlen: integer); stdcall;

Перша з них викликає плагін для роботи. Її параметри - це дескриптор вікна Lister'а (з його допомогою ми будемо підтримувати зв'язок між вікном плагіна і вікном Lister'а), ім'я файлу, що і комбінацію налаштувань Lister'а. Але налаштування нам поки що не знадобляться, так що на ShowFlags зараз можна не звертати уваги. Друга функція (вірніше, в термінах Delphi це процедура) викликається, коли завершується робота програми, і потрібно закривати вікна. Її параметр - теж дескриптор вікна Lister'а. Третя функція дозволяє Lister'у визначити, чи може плагін правильно розібратися з переданим йому файлом, або краще його відобразити за допомогою якогось іншого плагіна. В общем-то, можна обійтися і без другої за рахунком функції, оскільки в разі її відсутності вікно плагіна буде саме знищено стандартними засобами Windows API.

Додайте в проект форму ( "File" -> "New" -> Form) і видаліть з файлу форми глобальну змінну Form1: TForm1. Особливості написання DLL на Delphi такі, що глобальні змінні під час цього процесу під забороною. На форму покладіть компонент RichEdit (він знаходиться на вкладці "Win32" палітри компонентів Delphi). Встановіть його властивість Align на alClient (для цього потрібно використовувати вікно Object Inspector, що знаходиться в лівій частині середовища).

Вікно нашого плагіна не повинно мати рамки і заголовка, інакше вікно Lister'а буде виглядати, м'яко кажучи, дивно. Тому для створення вікна ми повинні перевизначити одну процедуру. У секції Protected класу вікна потрібно записати наступне:

procedure CreateParams (var Params: TCreateParams); override;

У тілі процедури пишемо наступне:

inherited CreateParams (Params); Params.Style: = (WS_CHILD or WS_MAXIMIZE) and not WS_CAPTION and not WS_BORDER; Params.WindowClass.cbWndExtra: = SizeOf (Pointer);

Перший рядок викликає успадкований стандартний метод. Друга обрізає рамку вікна, щоб воно не виглядало з вікна Lister'а неналежним чином. Третя резервує місце для того, щоб ми могли потім знищити вікно (глобальними змінними користуватися не можна - пам'ятаєте?).

Тепер можна перейти до безпосереднього заповнення тіла експортованих функцій. Тіло процедури ListDetectString буде коротким:

StrLCopy (DetectString, 'FORCE | EXT = "RTF"', MaxLen);

Ця функція копіює рядок "FORCE | EXT =" RTF "" в змінну DetectString. А рядок повідомляє Lister'у, що ми будемо відкривати своїм плагіном файли з розширенням "RTF" і при цьому переобумовленої стандартну функціональність переглядача.

Тіло ListLoad буде вже набагато довшим:

Var Form1: TForm1; begin Result: = 0; try if LowerCase (ExtractFileExt (string (FileToLoad))) <> '.rtf' then Exit; Form1: = TForm1.CreateParented (ListerWin); Form1.RichEdit1.Lines.LoadFromFile (string (FileToLoad)); Form1.Show; SetWindowLong (Form1.Handle, GWL_USERDATA, Integer (@ Form1)); PostMessage (Form1.Handle, WM_SETFOCUS, 0, 0); Form1.RichEdit1.SetFocus; Result: = Form1.Handle; except end; end;

Мінлива Form1 - це і є, власне, вікно плагіна. Ми перевіряємо розширення підсунутого плагіну файлу, завантажуємо його, показуємо вікно, зберігаємо покажчик на нього, щоб при нагоді знищити. Потім встановлюємо фокус на наш RichEdit і повертаємо дескриптор вікна плагіна. Оскільки код знаходиться в DLL-бібліотеку, поміщаємо все всередину блоку try ... except, щоб збій плагіна не привів до збою "командира".

Код ListerCloseWindow такий:

Form1: = Pointer (GetWindowLong (PluginWin, GWL_USERDATA)); Form1.Close; Form1.Free;

Отримуємо збережений адресу форми, закриваємо її і звільняємо пам'ять. Потрібно тільки не забути оголосити змінну Form1 і "обернути" все, що відбувається всередині процедури try ... except'ом.

Ну ось, залишилося тільки відкомпілювати плагін і встановити його в Total Commander'е. За ідеєю, ніяких складнощів з цим бути не повинно. Якщо ви зацікавилися написанням плагінів до TC, то зайдіть на сайт російськомовного співтовариства користувачів цієї програми wincmd.ru . У розділі "Статті" ви знайдете матеріали з написання плагінів на Delphi і C ++, а в розділі закачувань є повнофункціональні плагіни з відкритим вихідним кодом.

Вадим СТАНКЕВИЧ

Що таке плагіни?
Чим же ця динамічна бібліотека така вся з себе спеціальна?
Які плагіни писати?
Чому саме для нього?
Отже, пишемо?
Глобальними змінними користуватися не можна - пам'ятаєте?
Новости
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью