Конференция "Corba" » Как прочитать сгенерированное сообщение по останову сервиса [Delphi, Windows]
 
  • AbrosimovA © (24.05.06 15:18) [0]
    Ниже представлен код регистрации постоянного потребителя событий:


    //подключение к пространству имён
    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;



    я пытался читать данные события по останову любого из сервисов. Всё работает, но ..... форма становится недоступной из-за ожидания события на выделенной жирным шрифтом строке. Бьюсь с этим неделю: пробовал создавать отдельный поток, но не помогает.
    Как мне ожидать сообщения без "зависания формы и её элементов"?
  • umbra © (24.05.06 19:13) [1]
    можно следить за событиями асинхронно. вместо ExecNotificationQuery надо будет использовать ExecNotificationQueryAsync и создать еще один объект - контейнер для уведомлений. Подробности -
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/receiving_asynchronous_event_notifications.asp

    но вообще-то отдельный поток для слежения за событиями должен помочь
  • AbrosimovA © (25.05.06 08:43) [2]
    Большое спасибо! Получилось.
 
Конференция "Corba" » Как прочитать сгенерированное сообщение по останову сервиса [Delphi, Windows]
Есть новые Нет новых   [134428   +39][b:0][p:0.001]