|
|
| Посл.отвђт | Сообщен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 |
|
|
Дата: Сен 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 |