Пишем простейщий сервис. Помогите.
От: Аноним  
Дата: 31.03.05 07:01
Оценка:
Создаем проект ATL (7.0), тип — Service.
Код:

// BPSystemInfo.cpp : Implementation of WinMain

#include "stdafx.h"
#include "resource.h"

// The module attribute causes WinMain to be automatically implemented for you
[ module(SERVICE, uuid = "{D1FD36AA-1799-4F51-B1AD-1312B0540206}", 
         name = "BPSystemInfo", 
         helpstring = "BPSystemInfo 1.0 Type Library", 
         resource_name="IDS_SERVICENAME") ]
class CBPSystemInfoModule
{
public:
    
    HRESULT InitializeSecurity() throw()
    {
        // TODO : Call CoInitializeSecurity and provide the appropriate security settings for 
        // your service
        // Suggested - PKT Level Authentication, 
        // Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY 
        // and an appropiate Non NULL Security Descriptor.

        return S_OK;
    }
    /**
        Главная функция сервиса. При выходе из нее сервис завершает свою работу.
    */

    HRESULT Run( int nShowCmd = SW_HIDE ) throw( );

    /**
        Функция обратного вызова. Вызывается системой, если необходимо остановить сервис.
    */

    void OnStop() throw();

    /**
        Функция обратного вызова. Вызывается системой при выключении компьютера.
    */

    void OnShutdown() throw()
    {
        OnStop();
    }
    
};

void CBPSystemInfoModule::OnStop() throw()
{
    SetServiceStatus(SERVICE_STOP_PENDING);
}
HRESULT CBPSystemInfoModule::Run( int nShowCmd  ) throw( )
{
    
    return CAtlServiceModuleT<CBPSystemInfoModule,IDS_SERVICENAME>::Run(nShowCmd);
}

Все главные функции на месте, компилируется все нормально, устанавливается в систему без проблем с помощью CreateService. НО! При попытке запуска службы — "Служба не ответила на запрос своевременно". Что не хватает в данном каркасе? Мне бы хотелось получить службу, которая работала бы, но ничего не имела бы внутрях.
Re: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 31.03.05 07:47
Оценка:
Здравствуйте, Аноним, Вы писали:


А>[/ccode]

А>Все главные функции на месте, компилируется все нормально, устанавливается в систему без проблем с помощью CreateService. НО! При попытке запуска службы — "Служба не ответила на запрос своевременно". Что не хватает в данном каркасе?

Добавь хотя бы один COM объект в проэкт
Re[2]: Пишем простейщий сервис. Помогите.
От: chabster Украина chabster.blogspot.com
Дата: 01.04.05 12:56
Оценка:
Зачем там КОМ обьект?
"ssm" <13021@users.rsdn.ru> wrote in message news:1100296@news.rsdn.ru...
From: ssm

Здравствуйте, Аноним, Вы писали:


А>[/ccode]

А>Все главные функции на месте, компилируется все нормально, устанавливается в систему без проблем с помощью CreateService. НО! При попытке запуска службы — "Служба не ответила на запрос своевременно". Что не хватает в данном каркасе?

Добавь хотя бы один COM объект в проэкт
мужчины делятся на тех у кого есть спиннинг, и на тех у кого его нет
icq 98-120-682
Re: Пишем простейщий сервис. Помогите. Оценить
Posted via RSDN NNTP Server 1.9
Re[3]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 01.04.05 13:08
Оценка:
Здравствуйте, chabster, Вы писали:

C>Зачем там КОМ обьект?


by design, за подробностями в поиск
Re[4]: Пишем простейщий сервис. Помогите.
От: chabster Украина chabster.blogspot.com
Дата: 01.04.05 13:25
Оценка:
Плохой там дизайн. Одно только отсутствие поддержки нескольких сервисов в одном модуле искажает лицо
"ssm" <13021@users.rsdn.ru> wrote in message news:1103362@news.rsdn.ru...
From: ssm

Здравствуйте, chabster, Вы писали:

C>Зачем там КОМ обьект?


by design, за подробностями в поиск
мужчины делятся на тех у кого есть спиннинг, и на тех у кого его нет
icq 98-120-682
Re[3]: Пишем простейщий сервис. Помогите. Оценить
Posted via RSDN NNTP Server 1.9
Re[5]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 01.04.05 13:44
Оценка:
Здравствуйте, chabster, Вы писали:

C>Плохой там дизайн. Одно только отсутствие поддержки нескольких сервисов в одном модуле искажает лицо


и тебя тоже с 1 апреля
Re[6]: Пишем простейщий сервис. Помогите.
От: chabster Украина chabster.blogspot.com
Дата: 01.04.05 13:58
Оценка:
Ржу :-D
"ssm" <13021@users.rsdn.ru> wrote in message news:1103446@news.rsdn.ru...
From: ssm

Здравствуйте, chabster, Вы писали:

C>Плохой там дизайн. Одно только отсутствие поддержки нескольких сервисов в одном модуле искажает лицо


и тебя тоже с 1 апреля
мужчины делятся на тех у кого есть спиннинг, и на тех у кого его нет
icq 98-120-682
Re[5]: Пишем простейщий сервис. Помогите. Оценить
Posted via RSDN NNTP Server 1.9
Re[2]: Пишем простейщий сервис. Помогите.
От: Аноним  
Дата: 04.04.05 14:12
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Добавь хотя бы один COM объект в проэкт


Без этого никак?
Re[3]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 04.04.05 15:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Без этого никак?


неиспользуй ATL-ый мастер
Re[3]: Пишем простейщий сервис. Помогите.
От: Владислав Россия  
Дата: 05.04.05 09:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ssm, Вы писали:


ssm>>Добавь хотя бы один COM объект в проэкт


А>Без этого никак?


Можно и не добовлять.
В stdafx.h добавь строчку:

#define _ATL_NO_COM_SUPPORT

Перед этим:


//........
#include "resource.h"
#include <atlbase.h>
#include <atlcom.h>
#include <atlstr.h>


Должно помочь.
Suum cuique (лат.)
Re[4]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 05.04.05 13:36
Оценка:
Здравствуйте, Владислав, Вы писали:


В>Можно и не добовлять.

В>В stdafx.h добавь строчку:

В>#define _ATL_NO_COM_SUPPORT


В>Должно помочь.



а это проверялось? просто очень интерестно, а времени на "проверить" жалко
Re[5]: Пишем простейщий сервис. Помогите.
От: Владислав Россия  
Дата: 06.04.05 10:22
Оценка: 15 (1)
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Владислав, Вы писали:



В>>Можно и не добовлять.

В>>В stdafx.h добавь строчку:

В>>#define _ATL_NO_COM_SUPPORT


В>>Должно помочь.


ssm>

ssm>а это проверялось? просто очень интерестно, а времени на "проверить" жалко

=)
Конечно проверялось.
Работает.
Suum cuique (лат.)
Re[6]: Пишем простейщий сервис. Помогите.
От: Аноним  
Дата: 06.04.05 12:02
Оценка:
Здравствуйте, Владислав, Вы писали:



В>>>#define _ATL_NO_COM_SUPPORT


В>>>Должно помочь.


В>=)

В>Конечно проверялось.
В>Работает.

Хм, а у меня все тоже самое — на запрос не ответила своевременно. Можно мне выслать пустой рабочий сервис?
Re[7]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 06.04.05 12:46
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Хм, а у меня все тоже самое — на запрос не ответила своевременно. Можно мне выслать пустой рабочий сервис?


уже отослал
Создание простого сервиса с использованием библиотеки ATL
От: Владислав Россия  
Дата: 06.04.05 13:20
Оценка: 48 (10) +1
#Имя: FAQ.winapi.atlservice
Здравствуйте, Аноним, Вы писали:

А>Хм, а у меня все тоже самое — на запрос не ответила своевременно. Можно мне выслать пустой рабочий сервис?


Ок.

По шагам — создание простого сервиса с использованием библиотеки ATL (VS 7.1)

1. Wizard -> ATL -> ATL Project -> Service (EXE) без поддержки атрибутов. Называем его SimpleService.
2. Из solution, который сгенерил wizard, удаляем проект SimpleServiceSP.
3. Удаляем idl файл, папку — Generated Files вместе с SimpleService_i.c
4. Открываем файл SimpleService.cpp и видим такую картину:

// SimpleService.cpp : Implementation of WinMain

#include "stdafx.h"
#include "resource.h"
#include "SimpleService.h"

class CSimpleServiceModule : public CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >
{
public :
    DECLARE_LIBID(LIBID_SimpleServiceLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SIMPLESERVICE, "{01D73C58-D8F4-4A85-B27D-424443739977}")
    HRESULT InitializeSecurity() throw()
    {
        // TODO : Call CoInitializeSecurity and provide the appropriate security settings for 
        // your service
        // Suggested - PKT Level Authentication, 
        // Impersonation Level of RPC_C_IMP_LEVEL_IDENTIFY 
        // and an appropiate Non NULL Security Descriptor.

        return S_OK;
    }
};

CSimpleServiceModule _AtlModule;


//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    return _AtlModule.WinMain(nShowCmd);
}


Вносим изменения:
1. Убираем строчку DECLARE_LIBID(LIBID_SimpleServiceLib), т.к. она на хрен не нужна.
2. Добовляем евенты, что — бы потом легче жилось:

    HRESULT PreMessageLoop (int nShowCmd);
    void RunMessageLoop (void) throw();
    void OnContinue (void) throw();
    void OnPause (void) throw();
    void OnShutdown (void) throw();
    void OnStop (void) throw();


Не забываем про их реализацию.
Получаем следующий вид:


// SimpleService.cpp : Implementation of WinMain

#include "stdafx.h"
#include "resource.h"
#include "SimpleService.h"

class CSimpleServiceModule : public CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >
{
public :
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SIMPLESERVICE, "{01D73C58-D8F4-4A85-B27D-424443739977}")
    HRESULT InitializeSecurity() throw()
    {
        return S_OK;
    }

    HRESULT PreMessageLoop (int nShowCmd);
    void RunMessageLoop (void) throw();
    void OnContinue (void) throw();
    void OnPause (void) throw();
    void OnShutdown (void) throw();
    void OnStop (void) throw();
};

HRESULT CSimpleServiceModule::PreMessageLoop (int nShowCmd) throw()
{
    return CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::PreMessageLoop (nShowCmd);
}

void CSimpleServiceModule::RunMessageLoop () throw()
{
       CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::RunMessageLoop ();
}

void CSimpleServiceModule::OnContinue () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnContinue ();
}

void CSimpleServiceModule::OnPause () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnPause ();
}

void CSimpleServiceModule::OnShutdown () throw()
{
    OnStop ();
}

void CSimpleServiceModule::OnStop () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnStop ();
}

CSimpleServiceModule _AtlModule;


//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    return _AtlModule.WinMain(nShowCmd);
}


5. Открываем в студии вкладку — Solution Explorer, находим файло SimpleService.rc, открываем его как source file в редакторе VS, выносим оттуда tlb файл, в нашем случае — SimpleService.tlb.

6. В stdafx.h добавляем строчку:

#define _ATL_ALL_WARNINGS
#define _ATL_NO_COM_SUPPORT


//Перед этим:
#include "resource.h"
#include <atlbase.h>
#include <atlcom.h>

using namespace ATL;




Ура. Сервис готов !


Регистрация:

1. Для того, что — бы всё жило, нужно зарегестрировать это дело с командной строки набираем:
SimpleService.exe -service


Запускаем... Круто — работает, что и требовалось.
Стопим... Cool, останов произошёл !


Извини за некоторый вольный стиль изложения — времени у меня очень мало.
Сорцы работающего SimpleService здесь.
Suum cuique (лат.)
Re[8]: Пишем простейщий сервис. Помогите.
От: ssm Россия  
Дата: 06.04.05 14:18
Оценка:
Здравствуйте, Владислав, Вы писали:


В>Вносим изменения:

В>1. Убираем строчку DECLARE_LIBID(LIBID_SimpleServiceLib), т.к. она на хрен не нужна.
В>2. Добовляем евенты, что — бы потом легче жилось:

Проверил _ATL_NO_COM_SUPPORT, действительно пашет Спасибо еще раз.
Я обычно делаю по другому, переопределяю:

HRESULT PreMessageLoop(int nShowCmd)
{
    HRESULT hr = Base::PreMessageLoop(nShowCmd);
    DWORD WINAPI ThreadProc(CtestServModule *servModule);

    //создаю новый поток, в котором и ведется вся работа
    workThread.Attach(
        AtlCreateThread(ThreadProc, this));
    return hr;
}

HRESULT PostMessageLoop()
{    
    //жду окончания потока
    isStopped = true;
    ::WaitForSingleObject(workThread, 1000);
    return Base::PostMessageLoop();
}
Re[8]: Пишем простейщий сервис. Помогите.
От: Аноним  
Дата: 07.04.05 06:54
Оценка:
Здравствуйте, Владислав, Вы писали:


В>Запускаем... Круто — работает, что и требовалось.

В>Стопим... Cool, останов произошёл !


В>Извини за некоторый вольный стиль изложения — времени у меня очень мало.

В>Сорцы работающего SimpleService здесь.

Огромное спасибо! Все так просто оказывается.
Re: Создание простого сервиса с использованием библиотеки AT
От: Аноним  
Дата: 12.04.05 09:50
Оценка:
Здравствуйте, Владислав, Вы писали:


Круто. Всё работает.
Ура !!!!!!!!!!!!!
Re: Создание простого сервиса с использованием библиотеки AT
От: Аноним  
Дата: 12.04.05 09:54
Оценка:
Здравствуйте, Владислав,

А как там написать ASSERT
Re: Создание простого сервиса с использованием библиотеки AT
От: Аноним  
Дата: 15.04.05 06:21
Оценка:
Здравствуйте, Владислав


Скажите, пожалуйста, а в какой функции должнен быть код, отвечающий за загрузку слыжбы, а в какой основной её код.
Я попробовал сделать это в ServiceMain,и тогда служба выполнила свой код, но SCM показалось, что служба зависла, видимо, она не ответила на какой-то запрос.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.