Королівство delphi

Як писати сервіси на Delphi

Збережіть отримані модулі на диск. Я зберіг сервіс як main.pas, а проект - myservice.pas. Перейменуйте сервіс в myservice. Потім, додайте до проекту вікно. Це буде вікно, що показує стан сервера і інформацію про програму. Збережіть модуль під ім'ям aboutform. Так як ми будемо запускати наш сервіс ще й в режимі простої програми, то нам якось потрібно розрізняти ці два режими. Для цього можна завести глобальну змінну в модулі aboutform. Я назвав її fromservice: boolean. Якщо запускається сервіс, то вона дорівнює true, якщо як програма - false. Ось модуль сервісу:

Як бачите, він практично порожній. Тут є тільки два обробника на старт і останов сервісу. Ось код вікна about:

Іконку можна додати тільки починаючи з windows 95 або windows nt4 (як відомо, у неї робочий стіл від windows 95). Тому, спочатку потрібно перевірити версію windows, і якщо вона вище nt 3.51, то можна додавати. Додається іконка викликом api оболонки - shell_notifyicon. Для цього просто заповнюється структура tnotifyicondata і робиться відповідний виклик. Як бачите, саму іконку можна взяти з вікна about. Це добре, тому що тоді можна зробити іконку 16х16, а не 32х32. Така іконка буде краще виглядати в панелі завдань. ucallbackmessage буде надсилатися оболонкою щоразу, коли там відбуваються деякі події з мишею.

Тут ми просто просимо оболонку видалити іконку з панелі завдань.

Метод wmmidasicon оголошений як обробник події wm_midasicon. Тут перевіряється яке саме подія відбулася. Якщо подвійний клік по іконці, то показується вікно about, якщо клік правою кнопкою миші, то показується спливаюче меню. Це меню можна поставити прямо на вікно about. Там три пункти: close, роздільник, configuration, about. До нього ми ще повернемося пізніше.

При створенні вікна перевіряється версія windows, потім, якщо програма запущена як сервіс, то робиться невидимим пункт меню close і роздільник. Це зроблено спеціально, щоб зупиняти сервіс можна було тільки в штатному режимі з аплету управління комп'ютером. Далі, додається іконка.

При знищенні вікна іконка видаляється.

Про всяк випадок, якщо запушено як додаток, то закриття вікна не повинно закривати програму, але якщо натиснути пункт меню close, то програма повинна закриватися. Оскільки ми показуємо форму модально, то так воно і буде, але краще залишити цей код, щоб бути повністю впевненим.

На формі about є кнопка для виклику довідки. Оскільки application для сервісу не має методів виклику файлу допомоги, то довелося користуватися api. Тут id_cont визначено у файлі допомоги пункт, а myserver.hlp - ім'я файлу допомоги.

На формі коштує дві мітки з написом support і www.myserver.ru для переходу на сайт розробника.

Пункт меню close. Коли запушено додаток, то знищення вікна about закриває програму, тому що воно є головним вікном.

Пункт меню about - просто показує форму, тобто саму себе.

Пункт меню configuration. Тут один з варіантів вирішення проблеми. Часто для управління настройками сервісів використовують аплети в панелі управління. Для цього достатньо написати свою cpl. Але, не хотілося б повторювати весь цей код в сервері. Як відомо, cpl - це звичайна dll, тому нам нічого не заважає експортувати який-небудь метод з неї і завантажити її динамічно ...

Нарешті, код проекту сервісу:

Зверніть увагу, що в uses вказаний модуль form s, який не включається автоматично в проект. Він нам знадобиться для запуску нашого сервера як додатки.

Перевірка командного рядка на предмет вказівок інсталювати або видалити сервіс.

Функція перевіряє, що додаток запущено як сервіс. Цей код просто взятий з модуля scktsrvr.dpr. До речі, якщо розібратися в цьому проекті, то Ви зможете писати сервіси навіть на delphi 2, 3.

Якщо під час запуску програми як сервіс, або якщо його хочуть зареєструвати як сервіс, то ми йдемо по шляху як в проекті, створеному delphi за замовчуванням. Єдине, що краще явно вказувати, який саме application ми використовуємо: в svcmrg - це сервіс, а в form s - це просте додаток. Якщо ж запуск йде як просте додаток, вказуємо, що не потрібно показувати головну форму, робимо форму about основний (перша створена), створюємо форму сервісу. Важливо, що сервіс - це tdatamodule. І коли ми його так створимо з tapplication, то сервіс не буде запущений. Це і добре - у нас буде просто відповідний модуль даних j

Уже можна запустити і покликати по меню, закрити, зареєструвати і запустити як сервіс - все працює. Але, наш сервіс порожній і нічого не робить. Що він повинен робити - Вам вирішувати.
І останнє, зареєструвати сервіс можна командою myserver / install, а видалити реєстрацію - myserver / uninstall.
Успіхів у розробці своїх сервісів!

Схожі статті