· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› RegisterServiceProcess() CreateService()

Посл.отвђт Сообщенiе


Дата: Сен 9, 2004 12:52:36

Вот тут встала такая задача: запустить процесс как системный (надо чтоб он оставался запущенным при LogOut-e). В win2000/xp функции RegisterServiceProcess() нет. Попытался решить эту проблему так:
  sm:=OpenSCManager(NIL,NIL,SC_MANAGER_ALL_ACCESS);
  h:=CreateService(sm,'zMy','zMy',STANDARD_RIGHTS_REQUIRED,SERVICE_WIN32 _OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
    SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,'c:\s.exe',NIL,NIL,NIL,NIL,NIL );
  CloseServiceHandle(h);
  CloseServiceHandle(sm);

но процесс выполняется где-то 15 секунд и сдыхает (причем никаких экспекшенов не вылазит). Помогите пожалуйста с этим разобраться.


Дата: Сен 9, 2004 15:39:38

Чтобы процесс выполнялся как служба NT, он должен быть
написан особым образом. Иначе Service Manager прихлопнет его (по умолчанию - через 30 секунд).
Читайте Рихтера (если найдете) и ищите по форуму.


Дата: Сен 9, 2004 16:52:37

Особый образ заключается в том что надо SCменеджеру сказать что типа я инициализировался, и у меня все ок. Иначе он действительно прибивает процесс. Про это кстати в обычном мсдне написано вполне толково.


Дата: Сен 10, 2004 01:01:42

Tellur, цепляйся за статью в MSDN "Handle Logons in Windows NT and Windows 2000 with Your Own Logon Session Broker"


Дата: Сен 10, 2004 05:31:12

Это я знаю. Извиняюсь за некорректно постаненный вопрос. Но задача такая: запустить процесс как системный или еще как-нибудь, но так что бы он оставался запущенным при LogOut-e. Изменять исполняемый файл (и его модули) нельзя, исходников от него тоже естественно нет. Вопрос: можно ли этого как-нибудь достичь с учетом вышеперечисленных ограниченй.
У меня, например, недавно появилась еще одна мысля: создать свой процесс, который будет запускаться как сервис, а из него создавать Thread указывая в качестве lpStartAddress EntryPoint этого экзешника. Вопрос2: имеет ли такое решение "право на жизнь"?


Дата: Сен 10, 2004 09:35:43

в винде есть утилитка runasservice. можешь ее попробовать. А запуск проги из сервиса не даст результата. При logout прога все равно прибивается. Я выкрутился тем, что в сервисе периодически проверяю работает ли моя прога и если нет, то опять запускаю ее. При таком подходе прога стартует еще до входа в винду, при логуате закрывается но сервис ее опять перезапускает и она продолжает работать. Некрасиво но меня такой вариант устроил.


Дата: Сен 10, 2004 13:35:38

[ Tellur: Это я знаю. ]

Всё равно цепляйся за вышеуказанную статью :) На этом сайте лежит моя тулза WinObjEx. Если запустить с ключом -s, то она перезапускает себя как сервис, сервис ещё раз перезапускает её как обычный процесс, а так как сервис выполняется с правами LocalSystem, то и запускаемый им процесс тоже. После того, как третий процесс запустился два первых уходят. Всё это синхронизируется через события. При логауте этот процесс не прибивается и при следующем логоне даже окно остается на десктопе даже для ограниченного пользователя. Для того, чтобы прикрутить всё это мне потребовалось прочитать вышеозначенную статью и другие статьи того же автора, да сходить к нему на сайт и посмотреть сорсы его тулзы cmdasuser.


Дата: Сен 10, 2004 13:48:07

2 Four-F
Спасибо, что указали нужное напраление. Будем изучать.


Дата: Сен 10, 2004 20:07:35

Tellur
Попробуйте сначала утилиты InstSrv и SrvAny от MS.


Дата: Сен 13, 2004 06:07:26

Quantum
Действительно эти утилиты работают, программа запускается как сервис, но по непонятным причинам при логауте и последующем логине она исчезает


Дата: Сен 13, 2004 08:36:58

Причину я выяснил. мое приложение GUI-вское. И при логауте система шлет ему какие-то мессаги (WM_ENDSESSION, WM_CLOSE). Вот оно и закрывается.
А как это поправить я еще не придумал. SetWindowsHookEx
(WH_CALLWNDPROC,...) не подходит т.к. не позволяет удалить мессагу из очереди сообщений.


Дата: Сен 13, 2004 08:45:03

Хотя можно попробовать SetWindowLongPtr(GWLP_WNDPROC,...)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.095