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