Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заполнить обработчик событий SWbemSink? Аналог "ObjEvent" из autoit на Delphi 
:(
    Опции темы
TrashMaster
Дата 26.1.2014, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.1.2014

Репутация: нет
Всего: нет



Встроил в программу поддержку скриптов Microsoft Windows Script Host. Хочу немного расширить возможности поддержкой асинхронных событий. Работает через OLE Automation:

Код

var ScriptControl: IDispatch;
...
ScriptControl := CreateOLEObject('MSScriptControl.ScriptControl');
with (ScriptControl as IScriptControl) do begin
  Language := 'VBScript';
  Script.ExecuteStatement(" тут пользовательский сценарий ...");
  ...
end;


IScriptControl из MSScriptControl_TLB, msscript.ocx
IWshShell3 (WScript.Shell) из IWshRuntimeLibrary_TLB, wshom.ocx

В скриптах, запускаемых интерпретатором wscript.exe, объект "WScript" имеет метод CreateObject, который создает объект "WbemScripting.SWbemSink" и привязывает к его событиям процедуры из сценария. Затем эти процедуры используются в событиях обратного вызова WMI.

Код

   Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
   
   Sub Sink_OnObjectReady(OutParams, objAsyncContext)
   End Sub


Вопрос в реализации этой функции для OLE, где у WScript.Shell такого метода нет. 
Сам скрипт запускается в отдельном потоке и в целом выполняется асинхронно, но без нормальной поддержки SWbemSink нет возможности отслеживать несколько событий системы через WMI одновременно из одного сценария.
Работают все необходимые объекты и можно передавать процедуру как IDispatch
Код

GetRef("Sink_OnObjectReady")

или добраться до процедуры как IScriptProcedure через ScriptControl.Procedures.Item[N].
Объект "WbemScripting.SWbemSink" спокойно создается просто через CreateObject, но естественно, он еще не привязан к процедурам скрипта.

В autoit эта задача решена функцией ObjEvent.
Код

$Sink = ObjCreate("WbemScripting.SWbemSink")
ObjEvent($Sink , "SINK_")
Func SINK_OnObjectReady($objEvent, $objAsyncContext)
EndFunc


Т.е. без дополнительных программных прослоек, "заряжается" стандартный объект ОС. 
Проблема, как забраться в ISWbemSink из Delphi? Понятно, что через Invoke, но не знаю какие параметры передавать.
Може есть какой вспомогательный объект в WMI, который это может?

Код

    unit WbemScripting_TLB;
    ...
    // *********************************************************************//
    // Interface: ISWbemSink
    // Flags:     (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
    // GUID:      {75718C9F-F029-11D1-A1AC-00C04FB6C223}
    // *********************************************************************//
      ISWbemSink = interface(IDispatch)
        ['{75718C9F-F029-11D1-A1AC-00C04FB6C223}']
        procedure Cancel; safecall;
      end;
    ...
    // *********************************************************************//
    // DispIntf:  ISWbemSinkEvents
    // Flags:     (4240) Hidden NonExtensible Dispatchable
    // GUID:      {75718CA0-F029-11D1-A1AC-00C04FB6C223}
    // *********************************************************************//
      ISWbemSinkEvents = dispinterface
        ['{75718CA0-F029-11D1-A1AC-00C04FB6C223}']
        procedure OnObjectReady(const objWbemObject: ISWbemObject; 
                                const objWbemAsyncContext: ISWbemNamedValueSet); dispid 1;
        procedure OnCompleted(iHResult: WbemErrorEnum; const objWbemErrorObject: ISWbemObject; 
                              const objWbemAsyncContext: ISWbemNamedValueSet); dispid 2;
        procedure OnProgress(iUpperBound: Integer; iCurrent: Integer; const strMessage: WideString; 
                             const objWbemAsyncContext: ISWbemNamedValueSet); dispid 3;
        procedure OnObjectPut(const objWbemObjectPath: ISWbemObjectPath; 
                              const objWbemAsyncContext: ISWbemNamedValueSet); dispid 4;
      end;
    ...


Полная всей объектной модели WMI и в частности WbemScripting_TLB

Надеюсь на помощь сообщества.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1170 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.