|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
|
drkot |
|
|||
Ищущий Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
вот несколько переработанные модули.
до полной работоспособности еще далеко, но концепция ОПП соблюдена. в исходном модуле SvcMgr правки практически отсутствуют, по сути только DoAfterInstall добавлена. и нужно буден несколько полей перенести из private в protect. Смотрите, ругайте... Будет время доведу до ума... так как сам часто сервисы делаю Присоединённый файл ( Кол-во скачиваний: 31 ) clSvcMgrEx.rar 8,04 Kb -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
drkot |
|
|||
Ищущий Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
при том, что если Вы сможете обеспечить работу приложение вне runtime с меня пиво... RTTI есть неотъемлемая (слово то какое, паразит) часть приложения использующего объектную модель Delphi, то есть основанную на TObject. не помню с какой именно версии в RTTI стали доступны все разделы, а не только published Это сообщение отредактировал(а) drkot - 2.6.2012, 01:59 -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Начнем с малого:
Вы слышали о таком свойстве, как ComponentState и как оно используется в VCL, в особенности - в сеттерах published-свойств? Теперь - о главном. 1. То, что сделали Вы (а именно - реализация двух дополнительных свойств), относится к теме моего топика косвенно. Основное, а именно - реализация HandlerEx не раскрыто. 2. К моему сожалению, вижу полное непонимание отличия обычных методов от виртуальных, вследствие чего всё несколько неработоспособно (про несовпадение типов и то, что Вы даже не попытались скомпилировать свой код, я, пожалуй, умолчу) . Чтобы не быть голословным: метод Main в Вашем ServiceEx, а равно и остальные не-виртуальные не будут вызваны никогда, вследствие чего модуль clSU_unSvcMgrEx не функционален полностью в плане реализации цели, для которой он предназначается. Также, объявление в наследнике одноименного виртуального метода (я про DoCustomControl) для предка не значит ничего, что означает невозможность обработки дополнительных Control codes сервисом. Это вкратце, на самом деле такого в коде больше. Краткое резюме: Вы попытались сделать практически то же, что и я - замену оригинальному SvcMgr с расширенным функционалом. При этом, как я и говорил - запутался (а может, и не пытался разобраться?) сам автор "сервисных наследников", вдобавок породив совершенно ненужный модуль clSU_unSvcMgr, не соответствующий Вашему же замечанию про конфликт имен. Предоставьте работоспособный код, подтверждающий Ваше обвинение. Меня интересует конкретика, а не абстрактные утверждения. Напоследок: пожалуйста, прекратите бросаться общими громкими фразами про "концепцию ООП" и изрекать прописные определения, известные всем. Создается впечатление, что новичек прочитал умную книжку, "проникся" и теперь фонтанирует цитатами из нее, а судя по остальным Вашим сообщениям это не так. Это сообщение отредактировал(а) kami - 2.6.2012, 11:45 |
|||
|
||||
drkot |
|
|||
Ищущий Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
спасибо, что открыли мне глаза. жаль, что Вы видите только EX и не видите сути... пояснять здесь нечего, опять же жаль, что Вы, будучи столь продвинутым, не в состоянии отличить набросок, от полнофункционального кода... просто жаль
Так же жаль, что ЭГО и мешает Вам понять суть вопроса, и вместо того чтобы увидеть проблему от Вас слышен лишь пафос... Смысла продолжать общение не вижу. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
askman |
|
||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 10.11.2012 Репутация: нет Всего: нет |
Kami, спасибо за статью и за проект к ней. Мне они очень помогли в моей задаче. Нужно было из службы отслеживать момент входа локального пользователя в систему. Я тоже пришел к решению написать свой TService с дополнительными свойствами. В самый разгар работы нашел в инете ваш материал. В принципе, я шел аналогичным путем. Но тем ни менее, спасибо.
Правда, пришлось несколько править ваш проект (точнее сокращать), поскольку я разрабатываю на RAD Studio XE3, а там библиотека advapi32 уже подгужается автоматом, и есть определения функций RegisterServiceCtrlHandlerEx, ChangeServiceConfig2, а также соответствующих констант и структур данных. Одно небольшое замечание. В вашем проекте не работает функция TService.SetDescription. Поскольку в ней обращение к значению свойства Description осуществляется до его инициалтзации. Кроме того, функция AllocMem выделяет не инициализированную память, следовательно, в конце записанных туда данных необходимо вставить 0-символ. Вот ваша функция:
Вот предлагаемый мной вариант (он работает - проверено):
Если вы сочтете мой вариант верным, то можете заменить соответствующий код в вашем проекте. Еще раз спасибо за статью, с уважением, askman. P/S/ К сожелению, очень мало обсуждений в инете этого вопроса. |
||||
|
|||||
fenix25 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 9.12.2013 Репутация: нет Всего: нет |
А есть такое же, но под Delphi 7?
|
|||
|
||||
drkot |
|
|||
Ищущий Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: нет Всего: 8 |
а что мешает компилировать этот код под D7?
-------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
istok20 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 2.10.2016 Репутация: нет Всего: нет |
спасибо за проект!
первый сервис ( SvcMgrEx.zip 12,15 Kb) падает если отправить ему команду через ControlService не фиксили это? плюс, запись в журнал не работает в журнале пишет ошибку: Не удается найти описание для идентификатора события 0 из источника wesvc.exe. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере. Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием. К событию были добавлены следующие сведения: Процесс службы не может установить связь с контроллером службы Это сообщение отредактировал(а) istok20 - 3.10.2016, 13:13 |
|||
|
||||
kami |
|
||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Ой, давненько я сюда не заглядывал
По порядку:
Да, вы правы, это моя ошибка. Внутри SetDescription действительно нужно использовать Value. И неплохо бы проверять его на пустую строку.
Как раз-таки AllocMem выделяет инициализированную нулями память. http://docs.embarcadero.com/products/rad_s...m_AllocMem.html . Поэтому принудительно выставлять терминальный 0 нет необходимости. Не инициализирует память GetMem. Емнип, это и писалось под D7...Хотя могу и ошибаться, но код должен быть совместим с минимальными исправлениями. В том числе и для версий "выше". В частности, для компиляции под RAD10 Seattle всего лишь потребовалось везде исправить Forms на VCL.Forms и слегка подправить uses секцию аналогичным образом.
Перед выкладкой я тестировал код. Никаких проблем замечено не было. Если оттрассируете ошибку и напишете о ней - будет очень хорошо. Сейчас дополнительно проверил - стандартные команды типа старт/стоп, команды уведомлений о изменении статуса сессии пользователя - проходят на ура. Эта ошибка пишется, если попытаться запустить exe как обычное приложение, из (к примеру) проводника. Что, понятное дело, не отрабатывает правильно. |
||||||
|
|||||||
-Сергей- |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 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/ --------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет". |
|||
|
||||
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |