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

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


Ок.

По шагам — создание простого сервиса с использованием библиотеки 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 здесь.
Автор: Владислав    Оценить