Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизОшибка TService в D5 Найти похожие ветки
← →
kami © (2006-03-20 07:43) [0]Создаю пустой интерактивную службу, из всего кода - в
OnExecute
:While not terminated do
ServiceThread.ProcessRequests(True);
Дальше такая последовательность:
- Устанавливаю, перезагружаюсь.
- захожу под гостем, LogOut
- захожу под админом - через 2 минуты (а иногда и раньше) служба вылетает...
само собой, это все на виртуальной машине (нет желания экспериментировать на своей)
ProcessExplorer показывает, что за миг перед вылетом в хендлах появляетсяEvent: BaseNamedObject\userenv : UserProfile setup event
(ну и парочка ErrorReporting)
Как от этого избавиться (без интерактивности не обойтись, своих потоков я в коде не создаю)? По коду TService и TServiceThread ничего не обнаружил, да и не понимаю, что искать...
← →
kami © (2006-03-20 19:51) [1]ммм... Up.
Подскажите, хоть, в каком направлении копать... Неинтерактивный сервис при таких манипуляциях не вылетает, оно и понятно - он работает в своей оконной станции и десктопе, которым все равно, кто там логинится. Просмотрев MSDN (навеяно веткой http://delphimaster.net/view/4-1138482663/ обнаружил, что даже OpenWindowsStation для неинтерактивных сервисов "не котируется"). Создавать же, как пишет тот же MSDN отдельное приложение для связи с десктопом чревато полной переделкой кода программы (вернее, не полной, но значительной и весьма неприятной).
Может, есть какой-то более простой способ ? Подскажите, please, уже не знаю, что и думать...
← →
Eraser © (2006-03-20 20:24) [2]
> kami © (20.03.06 07:43)
Нужны 2 весчи.
1. Используй Winlogon Notification Package, чтобы определить, что пользователь совершил logon, logoff или заблокировал рабочую станцию.
2. Переключить поток сервиса (возможно несколько потоков) на текущий раб. стол. OpenInputDesktop, SetThreadDesktop.
см. MSDN там подробнее описано.
← →
kami © (2006-03-20 21:20) [3]Eraser © (20.03.06 20:24) [2]
Если я правильно понял, там все делается через реестр (то есть, нет специальной ф-и для регистрации этой dll). ?
Не будет ли вреда, если указанные функции будут в библиотеке, задействованной приложением (загружается статически)?
А так - кроме этих вопросов, пока вроде понятно.
Попробую сделать "проверочный" сервис, посмотрим, что получится...
Спасибо.
← →
Eraser © (2006-03-20 21:49) [4]
> kami © (20.03.06 21:20) [3]
> Если я правильно понял, там все делается через реестр (то
> есть, нет специальной ф-и для регистрации этой dll). ?
да, регистрировать надо в реестре
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
> Не будет ли вреда, если указанные функции будут в библиотеке,
> задействованной приложением (загружается статически)?
не знаю... на то она и DLL что её несколько приложений использовать могут, но лучше сделать отдельную.. тем более что она в system32 должна находиться. Коммуникацию между этой DLL и приложением думаю можно с пом. тех же named pipes наладить.
← →
kami © (2006-03-20 22:19) [5]Eraser © (20.03.06 21:49) [4]
она в system32 должна находиться
Она и так там находится. Попробую сперва отдельную, потом "замиксовать" :)
Eraser © (20.03.06 21:49) [4]
тех же named pipes наладить
Думаю, хватит простого ControlService с моим параметром, но если не выйдет (кто его знает, будет ли запущен сервис при инициализации Winlogon Notification Packages )- придется что-нибудь в этом плане использовать...
← →
Eraser © (2006-03-20 22:26) [6]
> kami © (20.03.06 22:19) [5]
> кто его знает, будет ли запущен сервис при инициализации
> Winlogon Notification Packages
скорее всего не будет.
Но думаю ControlService вполне подойдёт... в крайнем случае ошибку вернёт, если сервис не запущен.
Страницы: 1 вся ветка
Текущий архив: 2006.04.02;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.038 c