![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка искл. ситуаций в WinNT Service [D7, WinXP]
Прогер © (2006-12-22 08:30:00)Глобальная переменная TApplication для EXE предусматривает обработчик (событие) OnException, с помощью которого я протоколирую все возникающие исключительные ситуации. Но это в приложении (EXE). А как быть с сервисом?
Прогер (2006-12-22 14:11:00) [1]Большое прогерское СПАСИБО за обсуждение темы!
Прогер (2006-12-22 14:08:00) [2]
> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Имя
> службы>\ImagePath
Указан полный путь поиска EXE-файла с сервисом. Если всю строку взять в двойные кавычки - ЗАПУСКАЕТСЯ!!!
BiN (2006-12-22 14:06:00) [3]
> Сергей М. © (22.12.06 13:56) [33]
>
> Другой вопрос, почему система выдает такую идиотскую ошибку
> ?
>
> Впрочем, это не новость. Схожая ситуация наблюдается при
> попытке загрузки заведомо существующего dll-модуля по заведомо
> корректному пути: если ф-ция DllMain() вернула не 0, система
> кричит, мол, указанный файл по указанному пути не найден,
> что есть очевидная ерунда.
Странно. У меня вот выдала "System Error. Code: 1114.
A dynamic link library (DLL) initialization routine failed".
Сергей М. (2006-12-22 13:56:00) [4]
> BiN © (22.12.06 13:47) [31]
Ну это легко проверить, разместив ехе-файл сервис-приложения по идентичному пути на той машине, где сервис успешно до этого стартовал.
Другой вопрос, почему система выдает такую идиотскую ошибку ?
Впрочем, это не новость. Схожая ситуация наблюдается при попытке загрузки заведомо существующего dll-модуля по заведомо корректному пути: если ф-ция DllMain() вернула не 0, система кричит, мол, указанный файл по указанному пути не найден, что есть очевидная ерунда.
BiN (2006-12-22 13:48:00) [5]
> Прогер (22.12.06 13:46) [30]
>
>
> Ещё бы понимать, что должно быть прописано в реестре :)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Имя службы>\ImagePath
BiN (2006-12-22 13:47:00) [6]
> Сергей М. © (22.12.06 13:44) [29]
>
> Жуть какая) ...
>
> Все-таки загляни в реестр, проверь правильность регистр.
> записей для этого сервиса
Думаю, именно в этом и дело. Т.к. борланд почему-то не следует рекомендации msdn:
lpBinaryPathName
[in] ... If the path contains a space, it must be quoted so that it is correctly interpreted.
Прогер (2006-12-22 13:46:00) [7]
> Все-таки загляни в реестр, проверь правильность регистр.
> записей для этого сервиса
Ещё бы понимать, что должно быть прописано в реестре :)
В общем, на днях переустанавлю ОС. Вот хохма будет, если ошибка сохраниться! :)
Сергей М. (2006-12-22 13:44:00) [8]Жуть какая) ...
Все-таки загляни в реестр, проверь правильность регистр.записей для этого сервиса
Прогер (2006-12-22 13:37:00) [9]
> Возможно код отказа, возвращенный по GetLasError при возврате
> ф-цией False, прояснит ситуацию
Код 193
{ %1 is not a valid Windows NT application. }
ERROR_BAD_EXE_FORMAT = 193;
Сергей М. (2006-12-22 12:30:00) [10]
> Прогер (22.12.06 12:27) [25]
Попробуй программно стартовать свой сервис.
см. StartService() и пр. ф-ции для обеспечения работы оной.
Возможно код отказа, возвращенный по GetLasError при возврате ф-цией False, прояснит ситуацию.
Сергей М. (2006-12-22 12:27:00) [11]
> Прогер (22.12.06 12:25) [24]
Ну это уже не существенно, раз на другой машине все работает.
Прогер (2006-12-22 12:27:00) [12]
> А ты, понимаешь ли, развел бодягу про исключения)
Окей, всё прекрасно. На чужом компьютере. А что же на моём? Куда копать-то... прям не знаю. Винду переустанавливать не охота...
Прогер (2006-12-22 12:25:00) [13]
> Т.е. ты утверждаешь, что ты сгенерировал ехе-файл сервис-
> приложения средствами соответствующего IDE-эксперта, при
> этом не внеся в текст проекта никаких изменений, инсталляция
> прошла якобы успешно (о чем имеются соотв.записи в реестре)
> и в результате имеешь вот такую картину при попытке старта
> сервиса ?
В Delphi7 Создать - ServiceAppl. Изменения: страрт вручную, отображаемое в консоли имя сервиса, OnStart (Started:= True;), OnStop (Stopped = True;). Ну мелочь в общем. Функционала никакого - просто запуск и останов.
Реестр не смотрел, после запуска с -install появляется сообщение "Service installed succ".
Сергей М. (2006-12-22 12:24:00) [14]Ну вот)
Все, оказывается, расчудесно работает.
А ты, понимаешь ли, развел бодягу про исключения)
Прогер (2006-12-22 12:21:00) [15]Установил сервис на другой компьютер (тоже WinXP SP2 rus) - работает!
Сергей М. (2006-12-22 12:18:00) [16]
> Не успеваю к процессу подключиться
см. стандартную справку "Debugging service applications"
> Само сообщение "...не является приложением Win32" наводит
> на плохую мысль об ошибке, допущенной компилятором
С трудом в это верится.
Т.е. ты утверждаешь, что ты сгенерировал ехе-файл сервис-приложения средствами соответствующего IDE-эксперта, при этом не внеся в текст проекта никакихизменений, инсталляция прошла якобы успешно (о чем имеются соотв.записи в реестре) и в результате имеешь вот такую картину при попытке старта сервиса ?
Прогер (2006-12-22 12:08:00) [17]После попытки запуска сервиса появляется сообщение:
---------------------------
Службы
---------------------------
Не удалось запустить службу A123Service1 на Локальный компьютер.
Ошибка 193: 0xc1
---------------------------
ОК
---------------------------
А в системном журнале: "... не явл-ся прил. Win32".
Прогер (2006-12-22 12:05:00) [18]С точками останова в сервисе проблема. Не успеваю к процессу подключиться. Поэтому отладку произвожу либо догадками, либо на основе протокола (локальные try...except).
Само сообщение "...не является приложением Win32" наводит на плохую мысль об ошибке, допущенной компилятором. Хотя с ключами -install, -uninstall отрабатывает с соответствующими сообщениями. Сервисы самой ОС, от антивируса и другие (не мои) работат без проблем.
Сергей М. (2006-12-22 11:56:00) [19]Более того, если бы ошибка была именно в твоем коде, в лог была бы записана строчка вида "Service failed on ...", а не та что ты наблюдаешь.
Сергей М. (2006-12-22 11:51:00) [20]
> Боюсь, что мой
Не надо гадать.
Если сервис-приложение стартует, то ты поймаешь брейкпойнт на первой же его строчке.