| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > ShellExecute из сервиса |
| Автор: Cashey 21.7.2008, 16:34 | ||
смысл примерно такой
но при запуске из менеджера сервисов генерится ошибка - Неизвестное программное исключение. предпологаю, что не нравится хэндл для ShellExecute. И паралельно вопрос, есть ли в Дельфи команда для запуска на исполнение внешнего файла, иная чем апишная ShellExecute? |
| Автор: Qu1nt 21.7.2008, 16:51 |
| WinExec, CreateProcess... |
| Автор: CodeMonkey 21.7.2008, 18:31 |
| А чего вы хотите достичь такой странной конструкцией? |
| Автор: Virtuals 22.7.2008, 05:39 | ||
ну вот так работать будет, почему так? ... ну что вспомню: а. важно: SleepEx(500,ServiceStatus.dwCurrentState = SERVICE_STOPPED); CreateX; |
| Автор: Riply 22.7.2008, 09:48 |
Я бы воздержалась от столь сомнительного утверждения P.S. Начала смотреть код, и как только увидела, что процедура CreateX исключает всякую возможность закрыть после нее открытые Handl`ы, поняла, что дальше можно не смотреть, ибо будущий баг профессионально заложен в первых же строчках. P.P.S. А потом еще спрашивают: "как такое модет быть ? Мой сервис стабильно работает, но через (час, день, неделю падает). Ошибок в нем нет, ведь первый час работает !" |
| Автор: Virtuals 22.7.2008, 10:27 | ||
| Riply, это не сомнительное утверждение, а кусок кода из рабочего проекта а мне и ненужно было стабильной работы сервиса, в данном примере реализованно только запустить процесс с правами систем и открытые Handl`ы мне побарабану были, этож только пример а не готовое прилизанное решение, и в нем хорошо просматриваются многие грабли, на которые нестоит наступать. ну для примера вот про это многие забывают, почемуто...
а при старте из сервиса, это ой как важно ЗЫ хотя если честно сервис стабилен и невылетает., имхо у мну принцип - отлаживаю куски в маненьких демках и только после этого переписываю все в проект. |
| Автор: Virtuals 22.7.2008, 11:53 | ||
| Riply, так лучше?
|
| Автор: Riply 22.7.2008, 12:06 |
Угу. Только пусть функция возвращает Boolean (что и получила от CreateProcess), меньше путаницы будет |
| Автор: Virtuals 22.7.2008, 12:29 |
| Riply, фиг мне так больше нравится кстати дополнил примерчик ради полноты картины |
| Автор: Cashey 22.7.2008, 15:00 | ||
я лично всегда разбираю код, а не использую тупое капи\паст Virtuals, не поверишь, но по факту не работает я так понял ты создавал сервис вручную, я же использую TService. возможно, не отрабатывается Start, а возможно NOD блочит запуск файла из сервиса. самое противное, что не удается службу отрейсить.... |
| Автор: Virtuals 22.7.2008, 15:13 | ||
| Cashey, а файл точно не запускается? может бонально пути неправильные? и как это не получается отрейсить? ну понятно что дебуг здесь не в помощь но посмотри внимательно мой пример, и вот те недостающая но нужная часть
ЗЫ если нужно могу весь код скинуть позже... |
| Автор: Cashey 22.7.2008, 15:59 | ||
пытаюсь разобратся про файловый трейсинг я с самого начало подумал, но тогда служба отказывается запускатся. Пишет не получен вовремя отзыв |
| Автор: Riply 22.7.2008, 16:12 |
Cashey, а я тебя и не имела ввиду, ветка то открыта для всех. Мало ли кто сюда забредет |
| Автор: CodeMonkey 22.7.2008, 16:21 |
Да ладно. Компилируем службу с включенной отладочной информацией, включая инфу TD32. Устанавливаем Output Directory в свойствах проекта в ту папку, где у вас лежит установленная служба (C:\Windows\System32?). Отбилдили, службу запустили. Далее в меню Delphi: Run/Attach to Process. Всё. Ставим на паузу, расставляем бряки, потом возобновляем процесс и отлаживаемся. Вроде ничего не забыл. Cashey, может быть вы прокомментируете, что вы хотите добиться? Просто запустить процесс из службы? Запустить процесс из службы для какого-то пользователя? Запустить процесс из службы для интерактивного пользователя? Может быть уведомить пользователя о каком-то событии (у меня вызвал подозрение флаг SW_RESTORE)? Что из этого? Или ещё что-то? Какая у вас служба? Интерактивная или нет? Под XP или под Vista? Дайте же информацию. Если это не является слишком уж большим секретом, то расскажите про свою задачу. Возможно, в этом случае Вы получите более толковый ответ. А то белиберда может получиться. Грубо говоря, если играешь в рулетку, то иметь 36 различных рекомендаций по тому, на какой номер ставить, -- это все равно, что не иметь ни одной © Geo. |
| Автор: Cashey 22.7.2008, 16:34 |
| Опаньки.... А функция то отробатывается. В Таск Менеджере процесс появляется, но визуально программа не появилась, хотя имеет визуальный интерфейс... |
| Автор: CodeMonkey 22.7.2008, 16:37 |
| Cashey, не в обиду будет сказано, но, может быть, предварительно стоит почитать что-то про службы? Вот, например, для начала: http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1348 |
| Автор: Cashey 22.7.2008, 16:38 | ||||
конечный смысл такой, служба должна отслеживать запущен ли конкретный файл и если его выгрузили то запустить заново. Программа при старте сворачивается в трей и мониторит действия пользователя. Под ХР для текущего пользователя. в кратце все. Добавлено через 2 минуты и 4 секунды
спасибо. сейчас ознакомлюсь... |
| Автор: CodeMonkey 22.7.2008, 17:06 |
| Вам нужно понимать, чем работа сервиса отличается от работы простого приложения. В частности, хоть немного про то, под каким пользователем что работает, кто такие "сеансы", и чем интерактивный сервис отличается от не-интерактивного. А после того, как вы это поняли - осознать, что сейчас вы пытаетесь написать криворукого монстра. Я серьёзно, лучше отказаться от этой затеи. Особенно, если учесть, что службы относятся к высоконадёжной доверенной части системы. И любые кривые службы (поверьте, ваша первая будет именно такой) будут очень негативно сказываться на работе всей машине. Видимая простота создания служб в Delphi создаёт впечатление, что создавать службы - легко и просто. Поверьте: это не так. Я не буду касаться темы unkillable app (просто почитать: http://blogs.msdn.com/oldnewthing/archive/2004/02/16/73780.aspx , http://blog.delphi-jedi.net/2008/03/17/you-cant-make-your-application-undestroyable/ ), но скажу, что это действительно неблагодарная тема. Почему вы думаете, что пользователь не остановит службу? Если ему не дадут это сделать какие-то права, то почему бы не запустить обычное приложение с теми же правами? Тогда пользователь не сможет его закрыть. Ещё вариант - запуск приложения и его копии. Пусть две копии следят друг за другом. Под Vista вообще оптимальное решение - использовать новые API ( http://msdn.microsoft.com/en-us/library/bb525421(VS.85).aspx ). Но, правда, это только как защита от вылетов приложения. Если вам уж так сильно приспичит именно сервис (я действительно рекомендую подумать ещё раз), то попробуйте ещё посмотреть: http://www.delphikingdom.ru/table/search.asp?ItemID=352&IsQuestion=2&namekey=%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2&Count=50 |
| Автор: Virtuals 22.7.2008, 18:25 | ||||||
| Cashey, ну блин какой особенный
файловый трейсинг почемуто у меня работает а у тебя нет...хотя уже наводит на мысль где у тя ошибки а может ну его TService, и ручками? ведь красявше получается и кода кот наплакал. ... 1. между begin и StartServiceCtrlDispatcher должно пройти минимум времени и тут файловыми операциями лучше не заниматся! Добавлено через 9 минут и 11 секунд Cashey, блин а для кого я здесь распинался с
и еще отдельно пометил про эту постоянную ошибку!!! нука быстро учить матчасть про столы и оконные станции а нафига у тя в коде Sleep(5000); чтобы менеджер сервисов гарантированно неувидел???
Добавлено через 12 минут и 54 секунды кстати стол пользователя по умолчанию обычно "Default" |
| Автор: Virtuals 22.7.2008, 19:11 |
| Cashey, и еще появилось чувство дежавю а нука пролистни страницу в самый низ и глянь А здесь смотрели? особо почитай Работа с ActiveX из NT сервиса, [?] да и остальные темы думаю составят интерес. |
| Автор: Cashey 23.7.2008, 08:26 | ||
что это такое? |
| Автор: CodeMonkey 23.7.2008, 09:30 |
| Есть предложение ознакомится с MSDN - http://msdn.microsoft.com/en-us/library/ms687098(VS.85).aspx. |
| Автор: Virtuals 23.7.2008, 10:18 | ||||
Cashey, кто тут давеча хвалился?
а теперь function Start(const CmdLine: string; Visibility : integer;winsta,dsk:pchar) где winsta,dsk это имя_оконной_станции и рабочий_ и после этого станет CreateProcDEFWINSTATION = 'WinSta0'; CreateProcDEFDESKTOP = 'winlogon'; Start(cMmd, SW_SHOWNORMAL,CreateProcDEFWINSTATION,CreateProcDEFDESKTOP); StartupInfo.lpDesktop:=PChar(WinSta+'\'+dsk); WinSta0\winlogon =
короче место где откроются окошки вашего приложения!!! WinSta0\winlogon это где ctrl alt del жмете WinSta0\Default это где юзер жить будет |
| Автор: Cashey 23.7.2008, 10:34 |
во! то что доктор прописал!!!!!! огромный плюс )))) |
| Автор: Virtuals 23.7.2008, 13:41 |
| Cashey, и всетаки подучи матчасть о этих волшебных вещах WINSTATION DESKTOP так как чует мое сердце что следующие грабли, на которые наступиш это че буш делать когда твой сервис уже работает а узер еще не залогинился DESKTOP WinSta0\Default будут находится в очень неприятном состоянии |