Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прочитать сгенерированное сообщение по останову сервиса [Delphi, Windows]


AbrosimovA ©   (2006-05-24 15:18:00) 

Ниже представлен код регистрации постоянного потребителя событий:


//подключение к пространству имён
objService := GetObject('winmgmts:\\.\Root\CIMV2');

//создание экземпляра класса EventViewerConsumer (потребитель событий)
objConsumer := objService.Get('EventViewerConsumer').SpawnInstance_();
//установка свойств потребителя событий
objConsumer.Name := 'ServiceStopped';
objConsumer.Description:='Service was stopped';
objConsumer.Severity:=1;
//запись потребителя событий
objConsumer.Put_;

//создание экземпляра класса __EventFilter (фильтр событий)
objFilter := objService.Get('__EventFilter').SpawnInstance_();
//установка свойств фильтра событий
objFilter.Name := 'ServiceStoppedEvent';
objFilter.QueryLanguage := 'WQL';
objFilter.Query := 'SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance isa ''Win32_Service'' AND TargetInstance.State=''Stopped''';
//запись фильтра событий
objFilter.Put_;

//******************************************************************************** ******************
objFilter := objService.Get('__EventFilter.Name=''ServiceStoppedEvent''');
objConsumer := objService.Get('EventViewerConsumer.Name=''ServiceStopped''');
//создание экземпляра класса __FilterToConsumerBinding (связка)
objBinding := objService.Get('__FilterToConsumerBinding').SpawnInstance_();
//установка свойств связки
objBinding.Filter := objFilter.Path_.RelPath;
objBinding.Consumer := objConsumer.Path_.RelPath;
//запись связки
objBinding.Put_;


Так


procedure WaitForEvent;
var colServices: OleVariant;
   objEvent: OleVariant;
begin
colServices := objService.ExecNotificationQuery(objFilter.Query);
objEvent := colServices.NextEvent;
Form1.Caption:=objEvent.TargetInstance.Name;
VarClear(objEvent);
VarClear(colServices);
end;


я пытался читать данные события по останову любого из сервисов. Всё работает, но .....форма становится недоступной из-за ожидания события на выделенной жирным шрифтом строке. Бьюсь с этим неделю: пробовал создавать отдельный поток, но не помогает.
Как мне ожидать сообщения без "зависания формы и её элементов"?


AbrosimovA   (2006-05-25 08:43:00) [1]

Большое спасибо! Получилось.


umbra   (2006-05-24 19:13:00) [2]

можно следить за событиями асинхронно. вместо ExecNotificationQuery надо будет использовать ExecNotificationQueryAsync и создать еще один объект - контейнер для уведомлений. Подробности -
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/receiving_asynchronous_event_notifications.asp

но вообще-то отдельный поток для слежения за событиями должен помочь


Наверх

Титульная страница Поиск, карта сайта Написать письмо