Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доработка TService, Внедрение HandlerEx 
V
    Опции темы
drkot
Дата 2.6.2012, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



вот несколько переработанные модули.
до полной работоспособности еще далеко, но концепция ОПП соблюдена.
в исходном модуле SvcMgr правки практически отсутствуют, по сути только DoAfterInstall добавлена.
и нужно буден несколько полей перенести из private в protect.

Смотрите, ругайте...  smile 
Будет время доведу до ума... так как сам часто сервисы делаю

Присоединённый файл ( Кол-во скачиваний: 31 )
Присоединённый файл  clSvcMgrEx.rar 8,04 Kb


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 2.6.2012, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(northener @  2.6.2012,  01:05 Найти цитируемый пост)
Но  при чём тут RTTI, создание объекта и ClassName? Да и вообще runtime?

при том, что если Вы сможете обеспечить работу приложение вне runtime с меня пиво...
RTTI есть неотъемлемая (слово то какое, паразит) часть приложения использующего объектную модель Delphi, то есть основанную на TObject.
не помню с какой именно версии в RTTI стали доступны все разделы, а не только published

Это сообщение отредактировал(а) drkot - 2.6.2012, 01:59


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 2.6.2012, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Начнем с малого:
Цитата(drkot @  2.6.2012,  00:36 Найти цитируемый пост)
kami, а как Вы представляете работу 

Вы слышали о таком свойстве, как ComponentState и как оно используется в VCL, в особенности - в сеттерах published-свойств?

Теперь - о главном.

Цитата(drkot @  2.6.2012,  01:50 Найти цитируемый пост)
Присоединённый файл
 clSvcMgrEx.rar 8,04 Kb

1. То, что сделали Вы (а именно - реализация двух дополнительных свойств), относится к теме моего топика косвенно. Основное, а именно - реализация HandlerEx не раскрыто.
2. К моему сожалению, вижу полное непонимание отличия обычных методов от виртуальных, вследствие чего всё несколько неработоспособно (про несовпадение типов и то, что Вы даже не попытались скомпилировать свой код, я, пожалуй, умолчу) . 
    Чтобы не быть голословным: метод Main в Вашем ServiceEx, а равно и остальные не-виртуальные не будут вызваны никогда, вследствие чего модуль clSU_unSvcMgrEx не функционален полностью в плане реализации цели, для которой он предназначается. Также, объявление в наследнике одноименного виртуального метода (я про DoCustomControl) для предка не значит ничего, что означает невозможность обработки дополнительных Control codes сервисом. Это вкратце, на самом деле такого в коде больше.

    Краткое резюме: Вы попытались сделать практически то же, что и я - замену оригинальному SvcMgr с расширенным функционалом. При этом, как я и говорил - запутался (а может, и не пытался разобраться?) сам автор "сервисных наследников", вдобавок породив совершенно ненужный модуль clSU_unSvcMgr, не соответствующий Вашему же замечанию про конфликт имен.

  Предоставьте работоспособный код, подтверждающий Ваше обвинение. Меня интересует конкретика, а не абстрактные утверждения.

Напоследок: пожалуйста, прекратите бросаться общими громкими фразами про "концепцию ООП" и изрекать прописные определения, известные всем. Создается впечатление, что новичек прочитал умную книжку, "проникся" и теперь фонтанирует цитатами из нее, а судя по остальным Вашим сообщениям это не так.

Это сообщение отредактировал(а) kami - 2.6.2012, 11:45
PM MAIL WWW   Вверх
drkot
Дата 3.6.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(kami @  2.6.2012,  11:13 Найти цитируемый пост)
Теперь - о главном.

спасибо, что открыли мне глаза.


Цитата(kami @  2.6.2012,  11:13 Найти цитируемый пост)
реализация HandlerEx не раскрыто

жаль, что Вы видите только EX и не видите сути... пояснять здесь нечего, 

Цитата(kami @  2.6.2012,  11:13 Найти цитируемый пост)
скомпилировать свой код

опять же жаль, что Вы, будучи столь продвинутым, не в состоянии отличить набросок, от полнофункционального кода... просто жаль

Цитата(kami @  2.6.2012,  11:13 Найти цитируемый пост)
Вы слышали о таком свойстве, как ComponentState и как оно используется в VCL, в особенности - в сеттерах published-свойств?


Цитата(drkot @  2.6.2012,  00:36 Найти цитируемый пост)
Добавлено через 6 минут и 32 секундыkami, а как Вы представляете работу код Pascal/Delphi1:TService.SetDescriptionhighlightSyntax('delphi_AwMTIy','delphi');в DesignMode? Что при каждом обновлении свойства будет проводится манипуляция по изменению описания? а если сервис не установлен в системе?

Так же жаль, что ЭГО и мешает Вам понять суть вопроса, и вместо того чтобы увидеть проблему от Вас слышен лишь пафос... 

Смысла продолжать общение не вижу.



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
askman
Дата 18.11.2012, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.11.2012

Репутация: нет
Всего: нет



Kami, спасибо за статью и за проект к ней. Мне они очень помогли в моей задаче. Нужно было из службы отслеживать момент входа локального пользователя в систему. Я тоже пришел к решению написать свой TService с дополнительными свойствами. В самый разгар работы нашел в инете ваш материал. В принципе, я шел аналогичным путем. Но тем ни менее, спасибо.
Правда, пришлось несколько править ваш проект (точнее сокращать), поскольку я разрабатываю на RAD Studio XE3, а там библиотека advapi32 уже подгужается автоматом, и есть определения функций  RegisterServiceCtrlHandlerEx, ChangeServiceConfig2, а также соответствующих констант и структур данных.

Одно небольшое замечание.
В вашем проекте не работает функция  TService.SetDescription. Поскольку в ней обращение к значению свойства  Description осуществляется до его инициалтзации. Кроме того, функция AllocMem выделяет не инициализированную память, следовательно, в конце записанных туда данных необходимо вставить 0-символ.

Вот ваша функция:
Код

procedure TService.SetDescription(const Value: String);
var
  Desc: TServiceDescription;
  hSCM, hService: THandle;
begin
  if Assigned(ChangeServiceConfig2) then
    if GetServiceHandles(hSCM, hService) then
      begin
        Desc.lpDescription := AllocMem(Length(Description) * SizeOf(Char) + SizeOf(Char));

        Move(Description[1], Desc.lpDescription^, Length(Description) * SizeOf(Char));
        if ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, @Desc) then
          FDescription := Value;

        FreeMem(Desc.lpDescription);

        FreeServiceHandles(hSCM, hService);
      end;
end;


Вот предлагаемый мной вариант (он работает - проверено):
Код

procedure TService.SetDescription(const Value: String);
var
  Desc: SERVICE_DESCRIPTION;
  hSCM, hService: THandle;
  Cnt: Integer;
begin
  if GetServiceHandles(hSCM, hService) then
  begin
    Cnt := Length(Value) * SizeOf(Char) + SizeOf(Char);
    Desc.lpDescription := AllocMem(Cnt);

    Move(Value[1], Desc.lpDescription^, (Cnt-1));
    Desc.lpDescription[Cnt] := #0;
    if ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, @Desc) then
      FDescription := Value;

    FreeMem(Desc.lpDescription);
    FreeServiceHandles(hSCM, hService);
  end;
end;


Если вы сочтете мой вариант верным, то можете заменить соответствующий код в вашем проекте.
Еще раз спасибо за статью, с уважением, askman.

P/S/ К сожелению, очень мало обсуждений в инете этого вопроса. 

PM MAIL   Вверх
fenix25
Дата 9.12.2013, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.12.2013

Репутация: нет
Всего: нет



А есть такое же, но под Delphi 7?
PM MAIL   Вверх
drkot
Дата 12.12.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



а что мешает компилировать этот код под D7?


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
istok20
Дата 3.10.2016, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.10.2016

Репутация: нет
Всего: нет



спасибо за проект!

первый сервис ( SvcMgrEx.zip 12,15 Kb) падает если отправить ему команду через ControlService

не фиксили это?

плюс, запись в журнал не работает
в журнале пишет ошибку:

Не удается найти описание для идентификатора события 0 из источника wesvc.exe. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере.

Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием.

К событию были добавлены следующие сведения: 

Процесс службы не может установить связь с контроллером службы



Это сообщение отредактировал(а) istok20 - 3.10.2016, 13:13
PM MAIL   Вверх
kami
Дата 5.10.2016, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Ой, давненько я сюда не заглядывал smile
По порядку:

Цитата(askman @  18.11.2012,  20:48 Найти цитируемый пост)
В вашем проекте не работает функция  TService.SetDescription. Поскольку в ней обращение к значению свойства  Description осуществляется до его инициалтзации. 

Да, вы правы, это моя ошибка. Внутри SetDescription действительно нужно использовать Value. И неплохо бы проверять его на пустую строку.

Цитата(askman @  18.11.2012,  20:48 Найти цитируемый пост)
Кроме того, функция AllocMem выделяет не инициализированную память, следовательно, в конце записанных туда данных необходимо вставить 0-символ.

Как раз-таки AllocMem выделяет инициализированную нулями память. http://docs.embarcadero.com/products/rad_s...m_AllocMem.html . Поэтому принудительно выставлять терминальный 0 нет необходимости.
Не инициализирует память GetMem. 
Цитата(fenix25 @  9.12.2013,  12:40 Найти цитируемый пост)
А есть такое же, но под Delphi 7? 

Емнип, это и писалось под D7...Хотя могу и ошибаться, но код должен быть совместим с минимальными исправлениями. В том числе и для версий "выше". В частности, для компиляции под RAD10 Seattle всего лишь потребовалось везде исправить Forms на VCL.Forms и слегка подправить uses секцию аналогичным образом.


Цитата(istok20 @  3.10.2016,  13:10 Найти цитируемый пост)
первый сервис ( SvcMgrEx.zip 12,15 Kb) падает если отправить ему команду через ControlService

Перед выкладкой я тестировал код. Никаких проблем замечено не было. Если оттрассируете ошибку и напишете о ней - будет очень хорошо. Сейчас дополнительно проверил - стандартные команды типа старт/стоп, команды уведомлений о изменении статуса сессии пользователя - проходят на ура.

Цитата(istok20 @  3.10.2016,  13:10 Найти цитируемый пост)
в журнале пишет ошибку:

Эта ошибка пишется, если попытаться запустить exe как обычное приложение, из (к примеру) проводника. Что, понятное дело, не отрабатывает правильно.
PM MAIL WWW   Вверх
-Сергей-
Дата 27.2.2017, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: 1
Всего: 1



Кстати такое же сообщение добавляется если отправить в лог сообщение при помощи LogMessage.
Чтобы это предотвратить, нужно подготовить таблицу сообщений (специальный файл), скомпилировать его с помощью Message Compiler (mc.exe) входит в состав MS Visual Studio. После компилирования утилита выдаст 2 файла rc и bin. rc файл нужно скомпилировать при помощи brcc32.exe, а получившийся файл ресурсов подключить к проекту. Чтобы Event Logger знал про эти сообщения, их нужно зарегистрировать в реестре.
Подробнее тут http://www.rusdoc.ru/articles/9776/
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.2204 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.