AS>>Вопрос автору — а доступна ли широкой общественности версия 2 библиотеки — та, что без переходниковАвтор: Игорь Вартанов
Дата: 05.08.05
?
ИВ>К сожалению, пока не доступна — на соответствующую статью, сопровождающую код, просто нету времени. Хотя в частном порядке могу отдать без проблем, милости прошу в мыло.
Игорь, ну а может просто выложите отдельно в исходниках, либо тут в виде ссылки в отдельном сообщении с кратким пояснением, чем отличается? Думаю, общественость бы не возмутилась, а совсем напротив
PS На мейл отписал.
Всем привет.
С любезного разрешения Игоря, я все же решил опубликовать свои доработки к 2-й версии фреймворка. В основном, меня там не устраивал синтаксис — как объявления сервисов, так и методов-обработчиков.
В результате получился некий монстрик. Брать
здесь.
Что там нового по сравнению с 1.0 и 2.0
1. (В отличие от 1.0) Переходники генерируются статически.
2. Возможность задавать идентификатор для создаваемого объекта сервиса, а также связывать сервис со статически объявленным объектом (что может быть очень полезно в классических MFC\WTL программах с их theApp и _Module:
SFL_SERVICE_TABLE_ENTRY(CMyService, MyService)
SFL_SERVICE_TABLE_ENTRY_EX(CMyService, MyService1, _T("My simple service"))
SFL_SERVICE_TABLE_LINK(CMyService, myService)
SFL_SERVICE_TABLE_LINK_EX(CMyService, myService1, _T("My simple service link"))
3. Изменен метод взаимодействия обработчиков и функции диспатча. Убраны ненужные (на мой взгля) параметры. Тут проще пояснить кодом.
Было:
DWORD OnStop(DWORD& /*dwWin32Err*/, DWORD& /*dwSpecificErr*/, BOOL& bHandled )
{
bHandled = TRUE;
return SERVICE_STOPPED;
}
Стало:
BOOL OnStop()
{
m_ssStatus.dwCurrentState = SERVICE_STOPPED;
return TRUE;
}
На мой взгляд, куда как проще, ну и писанины и нативного кода в результате меньше.
4. Изменена идеология регистрации сервисов — не используется external char [], а используется класс. В результате стало возможным из идентификатора сервиса получить экземпляр его прокси — SFL_SERVICE_PROXY(svcid).
5. Убран код, который создает свой main. Это, собственно, было одним из основных "минусов", на мой взгляд. Вместо этого в своей точке входа в нужном месте (после парсинга параметров\etc) пишем:
SFL_SERVICE_TABLE(svcTable,
....
int _tmain(int argc, _TCHAR **argv, _TCHAR **envp)
{
svcTable::Start();
return 0;
}
6. Убраны CONTROL_RANGE. На мой взгляд, это не юзабельно в сервисах, но требует реализации диспатчка на if-ах. switch оптимальнее.
7. Добавлены методы Run и PreHandle (по аналогии с PreProcess для MFC). PreHandle — заместо CONTROL_RANGE, при необходимости позволяет "поднять" данный функционал.
8. Убрано много кода, который в версии 2 остался с версии 1 и уже не нес смысловой нагрузки.
9. Для сервисов с HandlerEx добавлена возможность работы на NT4 системах. Пример такого сервиса как раз в указанной выше ссылке.
10. Результат в нативном коде практически соответствует, как если бы мы сервисы написали вручную на С.
В общем, изменений довольно много, наверняка еще многое забыл указать — библиотека практически переписана.
На большую гору плюсов, конечно, есть и минусы. Самый главный — зависимость от boost::preprocessor. Из него используется:
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/size.hpp>
если найдется герой, который напишет свою реализацию оных, которая не будет занимать мильон килобайт текста, будет супер. Меня на это дело уже не хватило
В общем, комментарии приветствуются.
PS если администрация или Игорь сочтут нужным перенести это в отдельный топик — я не против
AS>Вопрос автору — а доступна ли широкой общественности версия 2 библиотеки — та, что без переходниковАвтор: Игорь Вартанов
Дата: 05.08.05
?
Да, новая версия теперь доступна широкой общественности на CodeGuru:
SFL 2.0: Service Framework Library for Native Windows Service Applications, Part 1.
PS. Я намеренно старался сделать версии максимально близкими, как по синтаксису, так и по структуре. Так что, увы, Andrew, все ваши предложения были мною проигнорированы. Надеюсь, вас это не сильно огорчит.
PPS. Уже несколько лет как CodeGuru смигрировали на новый движок, в результате чего вся серия статей пострадала — тексты оказались катастрофически урезаны и, что хуже всего, исходники стали недоступны. На попытки взывать к их совести никто не реагирует. Приношу свои извинения за этих уродов. Поэтому SFL2.0, если она еще кого-то интересует, теперь выложена на GitHub, а именно здесь:
https://github.com/ivartanov/sfl2