Windows Service

  • Автор темы Real-Mulik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Real-Mulik

#1
в обработке события protected override void OnStart(string[] args) есть параметр.. по идее который должен хранить параметры для данной службы. Но на практике args.Length == 0. Т.е. в реестре прописана служба и запускаемый файл вот так:
Код:
"...\Visual Studio 2005\Projects\service\service\bin\Debug\service.exe" /mail
по сути в программу должен был передаться параметр mail... однако этого не происходит.. что за ... ?
 
M

mr_ST

#2
Боюсь ошибиться, но /mail, случайно не внутри кавычек должен быть?
 
R

Real-Mulik

#3
<!--QuoteBegin-mr_ST+5:03:2007, 15:14 -->
<span class="vbquote">(mr_ST @ 5:03:2007, 15:14 )</span><!--QuoteEBegin-->Боюсь ошибиться, но /mail, случайно не внутри кавычек должен быть?
[snapback]58247" rel="nofollow" target="_blank[/snapback]​
[/quote]
пробывал.. он тогда вааще службу отказывается запускать. пишет что файл не найден.. я посмотрел в касперском ексешник запускается так же.. т.е. параметр вне ковычек и с таким слешем...
 
R

Real-Mulik

#4
Рассказываю как это лечиться! Пользуется Visual Studia 2005. После создания службы по умолчанию формируется файл Pragramm.cs с примерным содержимым

Код:
static void Main()
{
ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[] { new MyService() };

ServiceBase.Run(ServicesToRun);
}
добаляем ручками параметры в Main и в MyService string[] args. В результате несложных махинаций получаем:
Код:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[] { new MyService(args) };

ServiceBase.Run(ServicesToRun);
}
Теперь идем в код самой службы, т.е. во внутренности класса MyService и дописываем (переписываем каму как нравиться) конструктор.. в результате новый конструктор выглядит так:
Код:
public MyService(string[] args)
{
Args = args;
InitializeComponent();
}
где Args - заранее объявленный в этом классе объект
string[] Args; //он то и хранит все параметры командной строки
 
R

Real-Mulik

#5
Вопрос №2. Не про параметры, но про службы. Вернее про ее компаненты. Проблемв заключается в динамическом создании таймера.
Сначала создается лист таймеров:

Код:
 private List<System.Windows.Forms.Timer> ListTimers = new List<System.Windows.Forms.Timer>();
Потом на событии OnStart в цикле создаю и инициализирую таймеры.
Код:
ListTimers.Add(new System.Windows.Forms.Timer(this.components));
ListTimers[i].InitializeLifetimeService();
ListTimers[i].Interval = 100;
ListTimers[i].Tick += new EventHandler(Patcher_Tick);
ListTimers[i].Enabled = true;
ListTimers[i].Start();
Все срабатывает без ошибок, но таймер не срабатывает.. Смотрел как студия автоматичкески делает идентификацию.. все тоже самое.. может кто знает ответ?
 
M

mr_ST

#6
Если этот код в сервисе то он не будет работать по вполне понятным причинам. System.Threading.Timer спасет отца русской демократии ;)
 
R

Real-Mulik

#7
<!--QuoteBegin-mr_ST+7:03:2007, 11:12 -->
<span class="vbquote">(mr_ST @ 7:03:2007, 11:12 )</span><!--QuoteEBegin-->Если этот код в сервисе то он не будет работать по вполне понятным причинам. System.Threading.Timer спасет отца русской демократии
[snapback]58434" rel="nofollow" target="_blank[/snapback]​
[/quote]
Во-во! Согласен. Студия заводит в заблуюжение... первы раз таймер брал из Toolbox из группы Components а потом обнаружил, что и в Forms и в Components один и тот же компанент. В 2003 этого безобразия не было.. вобщем "отца" спало следующее:
кл. пр. клавишей миши по Toolbox и выбираем Choose Items... Там находим компанент Timer. ставим птичку и доавляем.
Я пользовал динамическое добавление таймеров по аналогии с попровкой на немного другие свойства и методы ... вот код:
Код:
//список таймеров
private List<System.Timers.Timer> ListTimers = new List<System.Timers.Timer>();
....
//Инициализация
....
ListTimers.Add(new System.Timers.Timer());
((System.ComponentModel.ISupportInitialize)(ListTimers[i])).BeginInit();
ListTimers[i].AutoReset = true;
ListTimers[i].Interval = 1000;
ListTimers[i].Elapsed += new System.Timers.ElapsedEventHandler(Patcher_Elapsed);
ListTimers[i].Enabled = true;
((System.ComponentModel.ISupportInitialize)(ListTimers[i])).EndInit();
....
вот и все...
 
Статус
Закрыто для дальнейших ответов.