Русские документы
RSS rusdoc.ru  Найти :
Последние поступления
  Hardware:
Видеоустройства
Системные платы
Процессоры
Мобильные устройства
Аудиосистема
Охлаждение системы
Накопители информации
КПК и ноутбуки
Телефоны и связь
Периферия
Система
Сети
Разные устройства
 
  Programming:
Web-разработка
Языки программирования
Технологии и теория
Разработка игр
Программная инженерия
 
  Software:
Операционные системы
Windows 7
Базы данных
Обзоры программ
Графика и дизайн
   
  Life:
Компьютерная жизнь
Разные материалы
   
Партнеры
Публикация
Правовая информация
Реклама на сайте
Обратная связь
Экспорт в RSS Экспорт в RSS2.0
   

Автор: Владислав
Источник: 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 здесь.

 

Реклама:


Последнее на сайте :
28.05.2015:
Нужен надежный хостинг с поддержкой php mysql?
Бесплатный конвертер для видео файлов
Немножко философский пост про то, как мы в глаза смотрели
Самые заметные проблемы облачных провайдеров за 2012 год
Распределительная сеть дата-центров мирового масштаба — сердце империи Google
Google выделяет миллионы долларов на новый конкурс по взлому Chrome
Top 5 раздражающих моментов в работе программиста
Глава мобильного подразделения Ubuntu Ричард Коллинз рассказал о планах
Обзор планшета Acer ICONIA W7. Windows 8 по-профессиональному
Как получить nano-sim для iPhone 5?



Реклама:





© Copyright 1998-2012 Александр Томов. All rights reserved.