|
Кто сталкивался с написанием служб виндовс? | ☑ | ||
---|---|---|---|---|
0
Jump
03.05.12
✎
09:33
|
В общем нужно написать простенькую службу чтобы крутилась в памяти и запускала консольную программу по таймеру.
Что то нифига не получается в студии сделать это, вроде пустую написал установить не могу. Может кто пнет в нужном направлении. |
|||
1
zak555
03.05.12
✎
09:33
|
планировщик не предлагать ?
|
|||
2
Cube
03.05.12
✎
09:34
|
(1) +1
|
|||
3
Shurjk
03.05.12
✎
09:34
|
для начала было бы неплохо понять что вы понимаете под службой.
|
|||
4
ЧеловекДуши
03.05.12
✎
09:35
|
Я, и что там сложного?
|
|||
5
ЧеловекДуши
03.05.12
✎
09:35
|
+ ДелпХи 6 и выше уже имеют встроенную компоненту ;)
|
|||
6
Kandellaster
03.05.12
✎
09:36
|
||||
7
Kandellaster
03.05.12
✎
09:37
|
а вот и на православном борланде http://cppbuilder.ru/articles/0186.php
|
|||
8
Jump
03.05.12
✎
09:38
|
(5)Ну в дельфях я никак, там поверхностно VB, перл.
(1)Сейчас как раз все так и работает - запускает планировщик. В принципе все устраивает, только вот как настроить планировщик программно тогда? Ну чтобы клиент тыкал "далее" и у него появилось запланированное задание. |
|||
9
manyak
03.05.12
✎
09:48
|
||||
10
пипец
03.05.12
✎
09:49
|
докучи xstarter
|
|||
11
Jump
03.05.12
✎
09:51
|
(9)Во! То что надо! Спасибо!
|
|||
12
Jump
03.05.12
✎
09:59
|
(10)Тоже хорошая штука, только непонятно можно ли ее запускать без интерфейса в трее.
Мне не желательно чтобы пользователь сам там тыкал кнопочки. |
|||
13
andrewalexk
03.05.12
✎
09:59
|
(0) :) все кто сталкивался с написанием служб виндоус находятся на microsoft.com
|
|||
14
Зеленый Кот
03.05.12
✎
10:01
|
delphi
|
|||
15
Nikitas
03.05.12
✎
10:46
|
ставишь nnCron и будет тебе счастье.. настраиваешь как хочешь
|
|||
16
Жан Пердежон
03.05.12
✎
10:54
|
удаляешь кроны нафиг, пишешь в консоле
at /? и будет тебе счастье |
|||
17
Jump
03.05.12
✎
11:11
|
(16)А как это засунуть в инсталлятор? и at /? не работает если у пользователя нет пароля.
Мне то что надо - я отдаю пользователю файл setup.exe, тот его запускает, и все у него с этого момента запускаются задачи по таймеру. Т.е вариант с объяснением пользователю чего там куда писать в консоле, чтобы у него заработало не катит, как и заставлять его создавать пароль на учетную запись в винде. |
|||
18
Jump
03.05.12
✎
11:12
|
(15)А он умеет работать чисто в виде сервиса? Без пользовательского интерфейса?
|
|||
19
Nikitas
03.05.12
✎
11:38
|
nnCron - умеет много чего, и ввиде сервиса. на нем свои скрипты писать можно
|
|||
20
Жан Пердежон
03.05.12
✎
11:44
|
(17) ну извини, на столько телепатию еще не прокачал
|
|||
21
Жан Пердежон
03.05.12
✎
11:46
|
(17) какой пароль, зачем писать в консоле? ты прог или кто?)
|
|||
22
izekia
03.05.12
✎
11:49
|
(0) интересно, а что консольная программа делает?
|
|||
23
Cube
03.05.12
✎
11:50
|
(22) Крадет пароли, чо тут не понятного)
|
|||
24
izekia
03.05.12
✎
11:54
|
(23) консольных шпионов куча
|
|||
25
izekia
03.05.12
✎
11:54
|
(24) клавиатурных*
|
|||
26
ЧеловекДуши
03.05.12
✎
11:55
|
(8)Там нечего знать не надо, кромя парочки команд, первичных знаний о синтаксисе и написания кода, он кстати на подобие "Паскаля".
Компонента там организована на уровне кнопок, т.е. все делается кнопками и галочками. Все что нужно будет это прописать команду вызова другой программы. Но в инете и этого навалом :) |
|||
27
mistеr
03.05.12
✎
11:58
|
(17) Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?
То же самое и с nnCron. |
|||
28
ЧеловекДуши
03.05.12
✎
11:58
|
+ если заинтересуешься, то после компиляции нужно инсталировать службу:
"Твой екзе файл службы.EXE -INSTALL" "Твой екзе файл службы.EXE -UNINSTALL" |
|||
29
ковер
03.05.12
✎
12:00
|
(28) службы нужно писать на Си
|
|||
30
izekia
03.05.12
✎
12:01
|
(29) на асме-то кошернее будет)
|
|||
31
ковер
03.05.12
✎
12:02
|
(30) то ты слишком глубоко копнул - ты еще скажи в бинарном формате ее написать :)
|
|||
32
ковер
03.05.12
✎
12:09
|
(0) лови статью, в ней даже болванки есть для написания собственной службы
http://www.rsdn.ru/article/baseserv/services.xml |
|||
33
FN
03.05.12
✎
12:14
|
(17) делаешь "инсталятор" setup.cmd
в нем пишешь: at 12:00 /every:monday defrag.exe и вуаля - все как ты хотел - одним кликом для пользователя... |
|||
34
Rebelx
03.05.12
✎
12:29
|
(33)есть маленькая проблема - если у пользователя нет пароля, то будет работать только при выполненном входе
|
|||
35
Rebelx
03.05.12
✎
12:31
|
+(34) с другой стороны можно создать специального пользователя для этого задания ( net user /? )
|
|||
36
ковер
03.05.12
✎
13:25
|
(34) под другой учеткой можно делать
|
|||
37
Jump
03.05.12
✎
13:36
|
(27)"Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?" - конечно будет, она будет работать даже если в системе нет пользователей, а уж есть у каких-то пользователей пароль или нет ей до лампочки.
|
|||
38
Jump
03.05.12
✎
13:38
|
(29)А я думал их надо писать на чем умеешь :)
|
|||
39
Rebelx
03.05.12
✎
13:41
|
(37) тут ты не совсем прав. Служба может быть запущена от имени пользователя Локальная служба или Сетевая служба. От имени других пользователей - только при наличии пароля.
|
|||
40
Jump
03.05.12
✎
13:48
|
(39)Служба работает под системной учетной записью, т.е она загружается раньше чем появляется окно входа в систему.
Естественно потом при желании можно залогиниться и под пользователем. |
|||
41
Jump
03.05.12
✎
13:54
|
В общем cronNT под семеркой работать не желает.
Пока остановился на xstarter. |
|||
42
vcv
03.05.12
✎
13:59
|
Простую консольную утилиту можно запускать любым планировщиком. Штатным или сторонним.
Если обязательно хочется сервис, почти произвольную программу можно сделать сервисом с помощью srvany. |
|||
43
Torquader
03.05.12
✎
23:10
|
(39) служба может запускаться от имени системы или под любой другой учётной записью - всё это указывается при вызове CreateService.
Собственно,и запускаться она может или при загрузке или при входе пользователя - если поставить взаимодействие с рабочим столом. Я писал запуск командной строки под системной учётной записью - только надо искать - где это валяется - идея была - копировать диск,но системный профиль просто блокируется и наличие системной учётной записи не помогло. |
|||
44
IVIuXa
04.05.12
✎
05:57
|
(0)
schtasks конец... |
|||
45
IVIuXa
04.05.12
✎
05:58
|
+(44)
at |
|||
46
IVIuXa
04.05.12
✎
06:06
|
если тебе действительно нужно написать службу
то делается в среде microsoft studio без проблем можно и из exe сделать службу опять же у мелкомягких написано но мне так думается твой вариант это vbs + sfx |
|||
47
IVIuXa
04.05.12
✎
06:08
|
||||
48
ws_mason
05.05.12
✎
18:24
|
srvany вполне себе обертка. не знаю как на viste, 7, 2008 правда, но 2003 только в путь.
|
|||
49
Jump
05.05.12
✎
18:31
|
(47)Спасибо, все просто и понятно, а С# или VB в случае VisualStudio не принципиально.
Тут главное понять что вообще нужно сделать. Попробую в ближайшее время, а пока для решения своей задачи остановился на xstarter, по функционалу устраивает, ну и время уже не терпит. |
|||
50
Torquader
06.05.12
✎
12:21
|
Таки, кто писал под ДОС или Linux, где нет окон и диспетчера сообщений, тот сервис напишет без проблем.
Сначала нужно подключить диспетчер служб: BOOL StartServiceCtrlDispatcher(LPSERVICE_TABLE_ENTRY lpServiceStartTable) в который передаётся таблица с именем нашей службы и функцией VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv) которая является телом нашей службы. Эта функция будет выполняться до тех пор, пока работает наша служба (аргументы, как и у обычный main, только передаются из StartService). В ServiceMain мы должны подключить обработчик событий: SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(LPCTSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc) возвращаемый указатель мы будем использовать для смены статуса службы через BOOL SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus,LPSERVICE_STATUS lpServiceStatus) где передаётся структура, описывающая состояние службы. Указатель статуса закрывать не нужно - он освобождается после завершения службы. Зарегистрированный обработчик событий VOID WINAPI Handler(DWORD fdwControl) мы используем для отслеживания события завершения нашей службы и завершения работы системы. В итоге в ServiceMain должен быть бесконечный цикл, но если мы ничего не делаем, обязательно нужно вызывать Sleep, чтобы отдать неиспользуемое время системе - иначе всё будет зверски тормозить. Флаг выхода из цикла мы менаем в обработчике событий, когда получили событие завершения. |
|||
51
oleg_km
06.05.12
✎
15:48
|
(50) В итоге в ServiceMain должен быть бесконечный цикл, но если мы ничего не делаем, обязательно нужно вызывать Sleep, чтобы отдать неиспользуемое время системе - иначе всё будет зверски тормозить.
Флаг выхода из цикла мы менаем в обработчике событий, когда получили событие завершения. Я управлял событиями. Каждая команда службе - отдельное событие: HANDLE hEvCmd[3]; hEvCmd[0] = OpenEvent(SYNCHRONIZE | EVENT_MODIFY_STATE, FALSE, CEVENTEXIT); hEvCmd[1] = OpenEvent(SYNCHRONIZE, FALSE, CEVENTMODE); hEvCmd[2] = OpenEvent(SYNCHRONIZE, FALSE, CEVENTSTOP); SetEvent(hEvCmd[0]); bool lExit = true; while (lExit) { DWORD nRes = WaitForMultipleObjects(3, hEvCmd, FALSE, nIntProbe); switch (nRes) { case WAIT_TIMEOUT: if (!Probe1C()) { WriteLog(EVENTLOG_ERROR_TYPE, L"\n1C don't response" L"\n1C Server session stopped"); ReportStatus(SERVICE_STOPPED, ERR_1C_DNT_RESP, 0); return; } break; case (WAIT_OBJECT_0 + 1): lWndMode = !lWndMode; ShowMainWnd(lWndMode); break; case (WAIT_OBJECT_0 + 2): DoMethod(L"StopAllSessions"); break; case WAIT_FAILED: case WAIT_OBJECT_0: default: lExit = false; break; } } ServiceStop(); |
|||
52
IVIuXa
07.05.12
✎
07:21
|
(50)
абсолютно не прозрачный код, основанный на уже знании того что: Сначала нужно подключить диспетчер служб, в который нужно передать таблицу и т.д. я вот не вижу смысла обладать такими ненужными и не логичными знаниями программист должен сосредоточиться на решении поставленной задачи а не заниматься 99% времени подготовкой к началу решения задач.... |
|||
53
Torquader
08.05.12
✎
20:52
|
(52) открываем msdn - берём рабочий пример - и вперёд за решение задачи - если вам не интересно узнать как это делается и зачем - можно вообще поймать студента и предложить ему написать программу.
|
|||
54
Jump
08.05.12
✎
20:57
|
Да я в принципе когда пытался написать самостоятельно службу уперся в следующее -
Я создал из шаблона службу, написал код, попытался его отладить и столкнулся с тем что не могу установить службу. На примере из (47) я понял свои ошибки. - я не заполнил некоторые поля, и не сделал инсталлятор службы, почему-то я думал что это все идет автоматом. |
|||
55
Конфигуратор1с
08.05.12
✎
21:15
|
тоже интересно
|
|||
56
ЧеловекДуши
08.05.12
✎
21:37
|
С-ишные извращенцы :)
|
|||
57
Torquader
08.05.12
✎
23:42
|
(54) К сожалению, выясняется, что установить службу не так просто, если пытаться это сделать вручную, но CreateService и все её параметры спасают положение на ура.
|
|||
58
IVIuXa
09.05.12
✎
06:58
|
(53)
я ж пытаюсь объяснить помимо знания самого языка с(фигня) нужно еще знать эти всякие таблицы куда совать вот что я буду искать в MSDN ? я как бы не предполагал что туда нужно таблицу запихивать - это вообще глюк(как оказалось нет) |
|||
59
zak555
09.05.12
✎
10:08
|
процесс надо будет прятать ?
|
|||
60
Torquader
09.05.12
✎
12:38
|
(58) Ну, когда я первый раз писал, я просто искал функцию CreateService - поэтому у меня вопросов с созданием и установкой службы не возникло, а уже из этой функции выбирается список функций для управления службами - там уже всё есть.
|
|||
61
Jump
09.05.12
✎
14:45
|
(59)Зачем?
|
|||
62
mishaPH
09.05.12
✎
14:47
|
задачи ыиндовые глюкало страшное. тр запуститься. то зависнет. то зависнет так, что только перегруз помогал.
счас поставили ннкрон. изучаем. пока все нравиться. |
|||
63
zak555
09.05.12
✎
14:47
|
(61) на всякий случай =)
|
|||
64
gavrikprog
09.05.12
✎
14:48
|
(0)
тут было http://www.ozon.ru/context/detail/id/4023293/ |
|||
65
gavrikprog
09.05.12
✎
14:50
|
(64) ну или тут http://www.ozon.ru/context/detail/id/3577055/
не помню |
|||
66
gavrikprog
09.05.12
✎
14:52
|
(64) актуальная похоже эта
http://www.ozon.ru/context/detail/id/5497094/ |
|||
67
Torquader
13.05.12
✎
15:00
|
Кстати, для регистрации службы в системе можно использовать команду "SC CREATE", если набрать в командной строке "SC CREATE /?", то можно узнать, как она работает.
То есть создание и удаление службы можно делать не отходя от командной строки - всё проще, чем могло бы быть. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |