#0
by Jump
В общем нужно написать простенькую службу чтобы крутилась в памяти и запускала консольную программу по таймеру. Что то нифига не получается в студии сделать это, вроде пустую написал установить не могу. Может кто пнет в нужном направлении.
#8
by Jump
Ну в дельфях я никак, там поверхностно VB, перл. Сейчас как раз все так и работает - запускает планировщик. В принципе все устраивает, только вот как настроить планировщик программно тогда? Ну чтобы клиент тыкал "далее" и у него появилось запланированное задание.
#12
by Jump
Тоже хорошая штука, только непонятно можно ли ее запускать без интерфейса в трее. Мне не желательно чтобы пользователь сам там тыкал кнопочки.
#17
by Jump
А как это засунуть в инсталлятор? и at /? не работает если у пользователя нет пароля. Мне то что надо - я отдаю пользователю файл setup.exe, тот его запускает, и все у него с этого момента запускаются задачи по таймеру. Т.е вариант с объяснением пользователю чего там куда писать в консоле, чтобы у него заработало не катит, как и заставлять его создавать пароль на учетную запись в винде.
#26
by ЧеловекДуши
Там нечего знать не надо, кромя парочки команд, первичных знаний о синтаксисе и написания кода, он кстати на подобие "Паскаля". Компонента там организована на уровне кнопок, т.е. все делается кнопками и галочками. Все что нужно будет это прописать команду вызова другой программы. Но в инете и этого навалом :)
#27
by mistеr
Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля? То же самое и с nnCron.
#28
by ЧеловекДуши
+ если заинтересуешься, то после компиляции нужно инсталировать службу: "Твой екзе файл службы.EXE -INSTALL" "Твой екзе файл службы.EXE -UNINSTALL"
#33
by FN
делаешь "инсталятор" setup.cmd в нем пишешь: at 12:00 /every:monday defrag.exe и вуаля - все как ты хотел - одним кликом для пользователя...
#34
by Rebelx
есть маленькая проблема - если у пользователя нет пароля, то будет работать только при выполненном входе
#35
by Rebelx
+ с другой стороны можно создать специального пользователя для этого задания ( net user /? )
#37
by Jump
"Попробуй угадать, а твоя самописная служба будет работать, если у пользователя нет пароля?" - конечно будет, она будет работать даже если в системе нет пользователей, а уж есть у каких-то пользователей пароль или нет ей до лампочки.
#39
by Rebelx
тут ты не совсем прав. Служба может быть запущена от имени пользователя Локальная служба или Сетевая служба. От имени других пользователей - только при наличии пароля.
#40
by Jump
Служба работает под системной учетной записью, т.е она загружается раньше чем появляется окно входа в систему. Естественно потом при желании можно залогиниться и под пользователем.
#42
by vcv
Простую консольную утилиту можно запускать любым планировщиком. Штатным или сторонним. Если обязательно хочется сервис, почти произвольную программу можно сделать сервисом с помощью srvany.
#43
by Torquader
служба может запускаться от имени системы или под любой другой учётной записью - всё это указывается при вызове CreateService. Собственно,и запускаться она может или при загрузке или при входе пользователя - если поставить взаимодействие с рабочим столом. Я писал запуск командной строки под системной учётной записью - только надо искать - где это валяется - идея была - копировать диск,но системный профиль просто блокируется и наличие системной учётной записи не помогло.
#46
by IVIuXa
если тебе действительно нужно написать службу то делается в среде microsoft studio без проблем можно и из exe сделать службу опять же у мелкомягких написано но мне так думается твой вариант это vbs + sfx
#48
by ws_mason
srvany вполне себе обертка. не знаю как на viste, 7, 2008 правда, но 2003 только в путь.
#49
by Jump
Спасибо, все просто и понятно, а С# или VB в случае VisualStudio не принципиально. Тут главное понять что вообще нужно сделать. Попробую в ближайшее время, а пока для решения своей задачи остановился на xstarter, по функционалу устраивает, ну и время уже не терпит.
#50
by Torquader
Таки, кто писал под ДОС или 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
by oleg_km
В итоге в 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"
1C don't response" L"
1C 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
by IVIuXa
абсолютно не прозрачный код, основанный на уже знании того что: Сначала нужно подключить диспетчер служб, в который нужно передать таблицу и т.д. я вот не вижу смысла обладать такими ненужными и не логичными знаниями программист должен сосредоточиться на решении поставленной задачи а не заниматься 99% времени подготовкой к началу решения задач....
#53
by Torquader
открываем msdn - берём рабочий пример - и вперёд за решение задачи - если вам не интересно узнать как это делается и зачем - можно вообще поймать студента и предложить ему написать программу.
#54
by Jump
Да я в принципе когда пытался написать самостоятельно службу уперся в следующее - Я создал из шаблона службу, написал код, попытался его отладить и столкнулся с тем что не могу установить службу. На примере из я понял свои ошибки. - я не заполнил некоторые поля, и не сделал инсталлятор службы, почему-то я думал что это все идет автоматом.
#57
by Torquader
К сожалению, выясняется, что установить службу не так просто, если пытаться это сделать вручную, но CreateService и все её параметры спасают положение на ура.
#58
by IVIuXa
я ж пытаюсь объяснить помимо знания самого языка с(фигня) нужно еще знать эти всякие таблицы куда совать вот что я буду искать в MSDN ? я как бы не предполагал что туда нужно таблицу запихивать - это вообще глюк(как оказалось нет)
#60
by Torquader
Ну, когда я первый раз писал, я просто искал функцию CreateService - поэтому у меня вопросов с созданием и установкой службы не возникло, а уже из этой функции выбирается список функций для управления службами - там уже всё есть.
#62
by mishaPH
задачи ыиндовые глюкало страшное. тр запуститься. то зависнет. то зависнет так, что только перегруз помогал. счас поставили ннкрон. изучаем. пока все нравиться.
#67
by Torquader
Кстати, для регистрации службы в системе можно использовать команду "SC CREATE", если набрать в командной строке "SC CREATE /?", то можно узнать, как она работает. То есть создание и удаление службы можно делать не отходя от командной строки - всё проще, чем могло бы быть.
Тэги: Админ
Ответить:
Комментарии доступны только авторизированным пользователям
В этой группе 1С
- v8: БГУ Обмен с казначейством Альбом 8.2 - ошибка с кодом УБП
- Как сделать выгрузку базы данных SQL Версии?
- Редактирование области печати
- как менять шрифт в запросе
- Печать штрихкода в УФ. Помогла установка драйвера 1СПечать штрихкодов (ActiveX) версия 8.0.16.4
- ЗУП 2.5 Начисление за работу неполную смену в пределах нормы времени
- как в СКД вычислить год назад от текущей даты
- Что значит "в разрезе <чего-то>"?
- TecDoc + 1С
- А как 1С хранит числа в памяти?
- Драйвер для ЭККА
- как удалить строки тч документа
- MS SQL. Не сжимается лог
- УПП. Особенности начисления амортизации при РАУЗ
- Выбор параметры даты в модуле отчета на СКД
- Дата запрета изменения данных и РИБ
- Как использовать корневые свойства пакета XDTO?
- При подключении к хранилищу "Ошибка при выполнении файловой операции"
- Подскажите как скрыть область табличного документа
- Планограммы и RarusPlanoGraph