C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Как писать сервис / Разное / Borland C++

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 224 из 1083 +246 277
 От   : Kim Vladimir                        2:5020/400      11 Сен 02  21:31:43
 Кому : All                                                 11 Сен 02  22:21:24
 Тема : Как писать сервис?
-------------------------------------------------------------------------------
From: Kim Vladimir <vkim@taiso.ru>

Добрый день,

   Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
   сервисы под Builder и что это есть за сущность?

   Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
   пользователей, моей программы (TimeGuard), что ее желательно
   оформить как сервис... А вот как подобную штуку сделать, до сих пор
   так нигде и не нашел :(

   Hа Вас уповаю и заранее благодарен!

С уважением, Владимир Ким (vkim@taiso.ru)
http://nedrosom.taiso.ru




-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 246 из 1083 -224 *277
 От   : Andy Malyshev                       2:5020/362.55   12 Сен 02  01:08:47
 Кому : Kim Vladimir                                        12 Сен 02  15:02:14
 Тема : Как писать сервис?
-------------------------------------------------------------------------------
Привет Kim!

11 Sep 02 21:31, you wrote to All:

 KV>    Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
 KV>    сервисы под Builder и что это есть за сущность?

 "Сервисы под Билдер" это что-то новое. Hо как я понял, речь идет об HТ/2000/XP
сервисах. Тогда читать вот здесь:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/s
ervices.as p


WBR, Andy.
Homepage: http://andy.malyshev.name, E-Mail: mail@andy.malyshev.name

---
 * Origin: Саид, а ты как здесь ? Стреляли.... (2:5020/362.55)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 277 из 1083 -224 +282
 От   : Alexey Wolchansky                   2:5020/400      13 Сен 02  19:56:37
 Кому : Kim Vladimir                                        13 Сен 02  20:46:40
 Тема : Re: Как писать сервис?
-------------------------------------------------------------------------------
From: "Alexey Wolchansky" <wolchans@mail.spbnit.ru>

>    Пожалуйста подскажите, где можно почерпнуть знаний о том, как писать
>    сервисы под Builder и что это есть за сущность?


Сервисы- это вид программ под NT/W2000/XP. Hе имеют окна и простейшем виде
не интерактивны, хотя можно писать ин-е сервисы. Могут стартовать на
нескольких уровнях загрузки ОС.

>    Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
>    пользователей, моей программы (TimeGuard), что ее желательно
>    оформить как сервис... А вот как подобную штуку сделать, до сих пор
>    так нигде и не нашел :(

Если писать на API, то структура сервиса отличается от обычного приложения.
В Билдере есть готовая болванка File->New->Service Application. Сервис
получается неприлично большим, зато думать не надо и быстро.

С наилучшими
Алексей


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 282 из 1083 -277 +336 360
 От   : Kim Vladimir                        2:5020/400      13 Сен 02  23:20:16
 Кому : Alexey Wolchansky                                   14 Сен 02  13:20:57
 Тема : Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: Kim Vladimir <vkim@taiso.ru>

Добрый день Алексей,

AW> Сервисы- это вид программ под NT/W2000/XP. Hе имеют окна и простейшем виде
AW> не интерактивны, хотя можно писать ин-е сервисы. Могут стартовать на
AW> нескольких уровнях загрузки ОС.

Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание сервиса
отличается от принципов написания обычного приложения и если да, то в
каких основных аспектах или моментах?

>>    Буду очень рад Вашей помощи, т.к. уже давно мне приходят упреки от
>>    пользователей, моей программы (TimeGuard), что ее желательно
>>    оформить как сервис... А вот как подобную штуку сделать, до сих пор
>>    так нигде и не нашел :(

AW> Если писать на API, то структура сервиса отличается от обычного приложения.
AW> В Билдере есть готовая болванка File->New->Service Application. Сервис
AW> получается неприлично большим, зато думать не надо и быстро.

Скажите, а существуют ли вообще ресурсы, где можно было бы почерпнуть
более глубокие знания о том как писать сервисы под Builder? Конечно
очень желательно на русском :), но не обязательно...

Еще раз спасибо!
С уважением, Владимир Ким (vkim@taiso.ru)
http://nedrosom.taiso.ru




-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 336 из 1083 -282 +359 *360
 От   : Anton Batenev                       2:5020/400      16 Сен 02  10:19:34
 Кому : Kim Vladimir                                        16 Сен 02  13:15:02
 Тема : Re: Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: "Anton Batenev" <abbat@ngts.kuzbass.net>


> Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание

сервиса

> отличается от принципов написания обычного приложения и если да, то

в

> каких основных аспектах или моментах?

Hет, не сильно. Сервис - обыкновенное приложение, только с двумя
рабочими потоками.

> Скажите, а существуют ли вообще ресурсы, где можно было бы

почерпнуть

> более глубокие знания о том как писать сервисы под Builder? Конечно
> очень желательно на русском :), но не обязательно...

http://www.piter.com - Там ищи книгу "Программирование серверных
приложений для Windows 2000"



--- ifmail v.2.15dev5
 * Origin: NGTS, OTE (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 359 из 1083 -336
 От   : Kim Vladimir                        2:5020/400      16 Сен 02  21:25:47
 Кому : Anton Batenev                                       16 Сен 02  22:45:35
 Тема : Re[4]: Как писать сервис?
-------------------------------------------------------------------------------
From: Kim Vladimir <vkim@taiso.ru>

Добрый день(ночи) Антон,


>> Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание
AB> сервиса
>> отличается от принципов написания обычного приложения и если да, то
AB> в
>> каких основных аспектах или моментах?

AB> Hет, не сильно. Сервис - обыкновенное приложение, только с двумя
AB> рабочими потоками.

Да, действительно, немного по разбиравшись с этим вопросом методом
научного тыка, оказалось действительно не очень сложно...

Только вот возник у меня вопрос - нужно хранить настройки работы для
программы, а вот в каком месте реестра это принято делать для сервисов
даже не могу представить. Дело в том, что, как я понял, сервис
загружается еще до logon системы и пользоваться
HKEY_CURRENT_USER\SOFTWARE не совсем уместно... Более того, очень
желательно, что-бы изменить эти настройки было невозможно (в regedit),
во всяком случае пользователю без прав администратора...

>> Скажите, а существуют ли вообще ресурсы, где можно было бы
AB> почерпнуть
>> более глубокие знания о том как писать сервисы под Builder? Конечно
>> очень желательно на русском :), но не обязательно...

AB> http://www.piter.com - Там ищи книгу "Программирование серверных
AB> приложений для Windows 2000"

Большое спасибо! Как появятся деньги обязательно приобрету!

С уважением, Владимир Ким (vkim@taiso.ru)
http://nedrosom.taiso.ru




-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 360 из 1083 -282 +386
 От   : Alexey Wolchansky                   2:5020/400      17 Сен 02  00:14:39
 Кому : Kim Vladimir                                        17 Сен 02  15:36:55
 Тема : Re: Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: "Alexey Wolchansky" <wolchans@svs.ru>


Привет!

> Может быть мой вопрос ужасающе глуп, но все-же - сильно ли написание

сервиса

> отличается от принципов написания обычного приложения и если да, то в
> каких основных аспектах или моментах?

Hе будем путать глупость и незнание, ибо второе со временем проходит :)
Отличается несильно, так-же бьешь по клаве руками, смотришь глазами. Или
есть варианты?

Повторюсь, если использовать болванку из ВСВ, то разница только в более
геморройной отладке, необходимо запустить сервис и за 30 сек. успеть к нему
приаттачится. Дело тренировки :)
То есть сервис из под IDE кнопкой RUN запускать нельзя.
Если писать с нуля на API, разница существенна. Хотя и тут есть скелеты
сервисов, например в MSDN.
Плюс в уменьшении размера на 450 Кб.

> Скажите, а существуют ли вообще ресурсы, где можно было бы почерпнуть
> более глубокие знания о том как писать сервисы под Builder? Конечно
> очень желательно на русском :), но не обязательно...

www.rsdn.ru - статьи Александра Федорова, Сергея Холодилова - очень
рекомендую
http://delphi.xonix.ru/faq - "Сервисы - общие сведения"
http://delphi.mastak.ru - "Сервисы (службы) в Delphi на чистом API"
Есть книга Фролова (на работе, названия точно не вспомню), там вообще
разжевано, как писать на API.

С наилучшими
Алексей Волчанский


--- ifmail v.2.15dev5
 * Origin: Sovintel (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 386 из 1083 -360 +481
 От   : Vlad Foltz                          2:5030/1015     17 Сен 02  21:10:22
 Кому : Wolchans@svs.Ru                                     18 Сен 02  15:34:48
 Тема : Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
    Пpивет, Alexey !

Вт Сен 17 2002 00:14 по московскомy вpемени
Alexey Wolchansky написал к Kim Vladimir:

 AW> Повторюсь, если использовать болванку из ВСВ, то разница только в
 AW> более геморройной отладке, необходимо запустить сервис и за 30 сек.
 AW> успеть к нему приаттачится.

Хм. А что будет через 30 секунд?

 AW> Дело тренировки :) То есть сервис из под IDE кнопкой RUN запускать
 AW> нельзя.

Достаточно (хотя бы для отладки) оставить возможность стартовать не как сервис.

 AW> Если писать с нуля на API, разница существенна.

Даже страшно подумать, что же они там в эту болванку запихали? :)

Hу пока, Alexey.

vladislav_foltz@mail.ru
--- GoldEd snapshot-2001.03.04.
 * Origin: ########[OO]-[OO]-[OO]-[|+|+|>######### (2:5030/1015)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 481 из 1083 -386 +515
 От   : Anton Batenev                       2:5020/400      19 Сен 02  07:02:56
 Кому : All                                                 23 Сен 02  20:09:18
 Тема : Re: Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: "Anton Batenev" <abbat@ngts.kuzbass.net>


>  AW> Если писать с нуля на API, разница существенна.
> Даже страшно подумать, что же они там в эту болванку запихали? :)

Да ничего страшного!!!! Там все проще пареной репы!!! Кому надобно -
могу выслать примерчик (только на VC++, но там без разницы), EXE
которого занимает 11Kb!!! - Все написано на чистом WIN API.



--- ifmail v.2.15dev5
 * Origin: NGTS, OTE (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 515 из 1083 -481 +533
 От   : Andrey Belyakov                     2:5020/400      23 Сен 02  20:45:01
 Кому : Anton Batenev                                       23 Сен 02  21:14:33
 Тема : Re: Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: "Andrey Belyakov" <andrejb@netmail.lv>

> >  AW> Если писать с нуля на API, разница существенна.
> > Даже страшно подумать, что же они там в эту болванку запихали? :)
>
> Да ничего страшного!!!! Там все проще пареной репы!!! Кому надобно -
> могу выслать примерчик (только на VC++, но там без разницы), EXE
> которого занимает 11Kb!!! - Все написано на чистом WIN API.

Будет интересно поглядеть. Хммм... У тебя примера с контролем на
остановку нет? Интересует запрет на остановку.

Андрей.


-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)

- Добавленная эха (2:4626/100.147) ------------------------------ RU.CBUILDER -
 Сооб : 533 из 1083 -515
 От   : Anton Batenev                       2:5020/400      24 Сен 02  05:59:33
 Кому : Andrey Belyakov                                     24 Сен 02  10:34:51
 Тема : Re: Re[2]: Как писать сервис?
-------------------------------------------------------------------------------
From: "Anton Batenev" <abbat@ngts.kuzbass.net>


> > Да ничего страшного!!!! Там все проще пареной репы!!! Кому

надобно -

> > могу выслать примерчик (только на VC++, но там без разницы), EXE
> > которого занимает 11Kb!!! - Все написано на чистом WIN API.
> Будет интересно поглядеть. Хммм... У тебя примера с контролем на
> остановку нет? Интересует запрет на остановку.

Есть. Смотри код. Лишний код вырезан, однако общий смысл будет
понятен.

#include "stdafx.h"
//--------------------------------------------------------------------
-------
extern "C" typedef BOOL (__stdcall* ChangeServiceConfigPtr)
(
  SC_HANDLE hService,         // handle to service
  DWORD dwServiceType,        // type of service
  DWORD dwStartType,          // when to start service
  DWORD dwErrorControl,       // severity if service fails to start
  LPCTSTR lpBinaryPathName,   // pointer to service binary file name
  LPCTSTR lpLoadOrderGroup,   // pointer to load ordering group name
  LPDWORD lpdwTagId,          // pointer to variable to get tag
identifier
  LPCTSTR lpDependencies,     // pointer to array of dependency names
  LPCTSTR lpServiceStartName, // pointer to account name of service
  LPCTSTR lpPassword,         // pointer to password for service
account
  LPCTSTR lpDisplayName       // pointer to display name
);
//--------------------------------------------------------------------
-------
VOID WINAPI SNTPMain     (DWORD dwArgc, LPTSTR* lpszArgv);
VOID WINAPI SNTPHandler  (DWORD fdwControl);
int  WINAPI RunAsApplication (void);
void WINAPI InstallService   (void);
void WINAPI UnInstallService (void);
bool WINAPI CheckVersion     (void);
//--------------------------------------------------------------------
-------
SERVICE_STATUS_HANDLE hSS     = 0;
CRITICAL_SECTION      SNTPCS;
SERVICE_STATUS        SS;
//--------------------------------------------------------------------
-------

void WINAPI LockServiceStatus (void)
{
    EnterCriticalSection(&SNTPCS);
}
//--------------------------------------------------------------------
-------

void WINAPI UnlockSNTPObject (void)
{
    LeaveCriticalSection(&SNTPCS);
}
//--------------------------------------------------------------------
-------
#define UnlockServiceStatus() UnlockSNTPObject()
//--------------------------------------------------------------------
-------

char* WINAPI FindOneOf (char* p1, char* p2)
{
    while (p1!=0 && *p1!=0)
    {
        char* p = p2;
        while (p!=0 && *p!=0)
        {
            if (*p1==*p)
                return CharNext(p1);
            p = CharNext(p);
        }
        p1 = CharNext(p1);
    }
    return 0;
}
//--------------------------------------------------------------------
-------

SERVICE_TABLE_ENTRY ServiceTable[] = {
    {"SNTP Time Service", SNTPMain},
    {0, 0}
};
//--------------------------------------------------------------------
-------

int APIENTRY CRTWinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
    char* cmdline = GetCommandLine();
    char tokens[] = "-/";
    char* token = FindOneOf(cmdline, tokens);

    if (token!=0)
    {
        if (lstrcmpi(token, "install")==0)
        {
            InstallService();
            return 0;
        }
        else if (lstrcmpi(token, "remove")==0)
        {
            UnInstallService();
            return 0;
        }
        else if (lstrcmpi(token, "service")==0)
        {
            InitializeCriticalSection(&SNTPCS);
            if (CheckVersion())
            {
                if (StartServiceCtrlDispatcher(ServiceTable)==0)
                WriteLog("Failed to start service dispatcher");
            }
            DeleteCriticalSection(&SNTPCS);
        }
        else if (lstrcmpi(token, "application")==0)
            return RunAsApplication();
    }
    else
        MessageBox(0, "sntp.exe [/install | /remove | /service |
/application]", "Parameters", MB_OK);

    return 0;
}
//--------------------------------------------------------------------
-------

VOID WINAPI SNTPHandler (DWORD fdwControl)
{
    switch (fdwControl)
    {
        case SERVICE_CONTROL_SHUTDOWN:
        case SERVICE_CONTROL_STOP:
        {
            LockServiceStatus();
            if (SS.dwCurrentState==SERVICE_RUNNING)
            {
                SS.dwCheckPoint = 1;
                SS.dwCurrentState = SERVICE_STOP_PENDING;
            }
            else if (SS.dwCurrentState!=SERVICE_STOPPED)
                SS.dwCheckPoint++;
            SS.dwWaitHint   = 5000;
            SetServiceStatus(hSS, &SS);
            UnlockServiceStatus();
            break;
        }
        case SERVICE_CONTROL_INTERROGATE:
        {
            LockServiceStatus();
            if (SS.dwCurrentState!=SERVICE_RUNNING &&
SS.dwCurrentState!=SERVICE_STOPPED)
                SS.dwCheckPoint++;
            SS.dwWaitHint = 5000;
            SetServiceStatus(hSS, &SS);
            UnlockServiceStatus();
            break;
        }
    }
}
//--------------------------------------------------------------------
-------

VOID WINAPI SNTPMain (DWORD dwArgc, LPTSTR* lpszArgv)
{
    LockServiceStatus();
    if ((hSS=RegisterServiceCtrlHandler(ServiceTable[0].lpServiceName,
SNTPHandler))==0)
    {
        UnlockServiceStatus();
        return;
    }

    SS.dwServiceType      = SERVICE_WIN32_OWN_PROCESS;
    SS.dwCurrentState     = SERVICE_START_PENDING;

    // устанавливаем что может сервис (стоп/пауза итд)
    SS.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN;
    SS.dwWin32ExitCode    = NO_ERROR;
    SS.dwServiceSpecificExitCode = 0;
    SS.dwCheckPoint       = 1;
    SS.dwWaitHint         = 5000;
    SetServiceStatus(hSS, &SS);
    UnlockServiceStatus();

    // ...
    // инициализируем все необходимые для работы объекты
    // ...

    LockServiceStatus();
    SS.dwCurrentState = SERVICE_RUNNING;
    SS.dwWaitHint     = 30000;
    SS.dwCheckPoint   = 0;
    UnlockServiceStatus();

    while (true)
    {
        LockServiceStatus();
        if (SS.dwCurrentState!=SERVICE_RUNNING)
        {
            SS.dwWaitHint = 10000;
            SS.dwCheckPoint++;
        }
        SetServiceStatus(hSS, &SS);
        UnlockServiceStatus();

        // ...
        // выполняем что-то (собственно рабочий цикл сервиса)
        // ...

        LockServiceStatus();
        if (SS.dwCurrentState==SERVICE_RUNNING)
        SS.dwWaitHint = 30000;
        SetServiceStatus(hSS, &SS);
        UnlockServiceStatus();

        Sleep(0);

    }

    LockServiceStatus();
    SS.dwCurrentState  = SERVICE_STOPPED;
    SS.dwCheckPoint    = 0;
    SS.dwWin32ExitCode = NO_ERROR;
    SetServiceStatus(hSS, &SS);
    UnlockServiceStatus();
    return;
}
//--------------------------------------------------------------------
-------

int WINAPI RunAsApplication (void)
{
    // запускаем как приложение
    return 0;
}
//--------------------------------------------------------------------
-------

void WINAPI InstallService (void)
{
    if (!CheckVersion())
        return;
    SC_HANDLE hSCM = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (hSCM==0)
    {
        MessageBox(0, "Failed to open SCM", "Error", MB_OK |
MB_ICONERROR);
        return;
    }
    char MN[MAX_PATH+20];
    ZeroMemory(MN, MAX_PATH+20);
    MN[0] = '"';
    GetModuleFileName(0, &MN[1], MAX_PATH);
    lstrcat(MN, "\" /service");
    SC_HANDLE hSrv = CreateService(hSCM, "SNTP Server",
ServiceTable[0].lpServiceName, SERVICE_CHANGE_CONFIG,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
MN, 0, 0, 0, 0, 0);
    if (hSrv==0)
    {
        MessageBox(0, "Service already installed", "Information",
MB_OK | MB_ICONINFORMATION);
        CloseServiceHandle(hSCM);
        return;
    }

    HINSTANCE H = LoadLibrary("advapi32.dll");
    if (H!=0)
    {
        ChangeServiceConfigPtr ChangeServiceConfigEx =
(ChangeServiceConfigPtr)GetProcAddress(H, "ChangeServiceConfigA");
        if (ChangeServiceConfigEx!=0)
        {
            if ((*ChangeServiceConfigEx)(hSrv,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
MN, 0, 0, 0, 0, 0, "SNTP Server")==0)
                MessageBox(0, "Failed to change server config",
"Error", MB_OK | MB_ICONERROR);
        }
        else
            MessageBox(0, "ChangeServiceConfigA not found", "Error",
MB_OK | MB_ICONERROR);
        FreeLibrary(H);
    }

    CloseServiceHandle(hSrv);
    CloseServiceHandle(hSCM);
    MessageBox(0, "Service installed successful", "Success", MB_OK |
MB_ICONINFORMATION);
}
//--------------------------------------------------------------------
-------

void WINAPI UnInstallService (void)
{
    if (!CheckVersion())
        return;
    SC_HANDLE hSCM = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    if (hSCM==0)
    {
        MessageBox(0, "Failed to open SCM", "Error", MB_OK |
MB_ICONERROR);
        return;
    }
    SC_HANDLE hSrv = OpenService(hSCM, "SNTP Server", DELETE);
    if (hSrv==0)
    {
        MessageBox(0, "Service already removed", "Information", MB_OK
| MB_ICONINFORMATION);
        CloseServiceHandle(hSCM);
        return;
    }
    if (DeleteService(hSrv)==0)
    {
        MessageBox(0, "Failed to delete service", "Error", MB_OK |
MB_ICONERROR);
        CloseServiceHandle(hSrv);
        CloseServiceHandle(hSCM);
        return;
    }

    CloseServiceHandle(hSrv);
    CloseServiceHandle(hSCM);
    MessageBox(0, "Service removed successful", "Success", MB_OK |
MB_ICONINFORMATION);
}
//--------------------------------------------------------------------
-------

bool WINAPI CheckVersion (void)
{
    OSVERSIONINFO OVI;
    OVI.dwOSVersionInfoSize = sizeof(OVI);
    if (GetVersionEx(&OVI)==0)
    {
        MessageBox(0, "Unknown error", "Error", MB_OK | MB_ICONERROR);
        return false;
    }
    if (OVI.dwPlatformId!=VER_PLATFORM_WIN32_NT)
    {
        MessageBox(0, "Windows NT 4.0 or higher required", "Error",
MB_OK | MB_ICONERROR);
        return false;
    }
    return true;
}
//--------------------------------------------------------------------
-------



--- ifmail v.2.15dev5
 * Origin: NGTS, OTE (2:5020/400)