![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как прочитать сгенерированное сообщение по останову сервиса [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
но вообще-то отдельный поток для слежения за событиями должен помочь