|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Господа, а пролейте свет на написание служб!
Здравствуйте! Возникла необходимость, написать службу. Вроде все получается, но, есть парочку вопросов. Суть дела - есть хорошая программа, (назовем ее Софтина), научил ее работать самостоятельно. Исходников к ней нету, но мне на данный момент нужно ее просто запустить, и дело в шляпе. Суть в том, чтобы запустить ее по расписанию, без логина юзера в системе. То бишь - как службу.
Сделал я вот что - написал на Delphi службу, со свистелками и всем для меня необходимым, и довольно хитрым расписанием. По моей задумке - моя служба должна просто запускать эту "Софтину", 10 минут держать в работе, и после - убивать. А с последним трудности. Службу написать то я написал, но как работают сервисы Win, совершенно не имею представления... Если моя служба попытается запустить "Софтину" - что произойдет? Ведь Софтина, пока еще не служба. 1. Может ли служба запустить программу? (без логина в системе). 2. Если не сможет - я поюзаю утилиты, и запущу Софтину , как службу. Собственно вопросы : Приведите пожалуйста пару примеров, а именно - как запустить и как убить сторонний EXE из Delphi, или же - приведите пару примеров, как запустить, и остановить службу ? Думаю, вы меня поняли))) Заранее спасибо |
#2
|
||||
|
||||
Код:
{Эта небольшая функция закрывает приложения, соответствующие заданному имени .exe. Пример: KillTask('notepad.exe'); KillTask('iexplore.exe'); } uses Tlhelp32, Windows, SysUtils; function KillTask(ExeFileName: string): integer; const PROCESS_TERMINATE=$0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result:= 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
alexusankov (22.05.2013)
|
#3
|
||||
|
||||
Это гуд. А как быть с вопросами возможности запуска EXE службой (в фоне).
И запуск стороннего ехе? |
#4
|
||||
|
||||
У розыча пример видел, там брался "токен (или контекст, не помню точно как эта фигня зовется) текушего юзера" и как-то там запускалось под ним. См. сайт Александра Rouse Багеля.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
Вроде разобрался.
Но тем не менее я не понимаю, когда служба запускает оконное приложение - где оно работает то? Десктопа то нету MADMAN - у Багеля раскрывается тема, как службой отправить ShowMessage на рабочий стол текущего пользователя. А мне пользователи не нужны. Я хочу 'Софтину' запускать с помощью своей службы, когда никто в систему не зашел Последний раз редактировалось alexusankov, 23.05.2013 в 10:47. |
#6
|
||||
|
||||
Дак запускать тоже от имени пользователя надо, иначе софтина под системом запустится (если там ГУЙ, то не увидишь ничего на мониторе).
В примере розыча, там идет запуск самого же себя, только с параметрами. Ну софтину можно запускать (всякие шедулеры, мониторы), если там с рабочим столом никакого взаимодействия не будет. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
alexusankov (23.05.2013)
|
#7
|
||||
|
||||
Цитата:
Суть то как раз в том, чтобы она без захода пользователя ночью, снимала все данные. А для просмотра полученных данных, из SQL с ними уже номальное приложение работает. P.s. значит, я так понимаю, она запускается под неким системным профилем, и у них там свой рабочий стол грубо говоря. |
#8
|
||||
|
||||
Скорее его [рабочего стола] отсутствие.
Ну если прога без ГУЙя, то все, CreateProcess и фпирёт. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
||||
|
||||
У софтины то, есть ГУЙ.
Я просто нужные действия, button.click()'и, и нужные параметры полей переписал в OnShow(), и теперь для ее работы ее надо просто запустить. И убить через 10 минут. А ГУЙ то у нее есть. Бесполезный, но есть ;-) P.s. Про CreateProcess - незнаком. Сделал Код:
ShellExecute(GETGESKTOPWINDOW,'OPEN','c:\start.exe',nil,nil,SW_SHOWNORMAL); Последний раз редактировалось alexusankov, 23.05.2013 в 11:42. |
#10
|
||||
|
||||
Цитата:
Нельзя приложения с ГЕЙем из сервиса запускать (не, ну можно, но только в XP). — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
||||
|
||||
Цитата:
А CreateProcess'ом можно будет запускать везде? |
#12
|
||||
|
||||
Пардоньте, с ГУЙем, а не ГЕЙем
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |