Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как заполнить обработчик событий SWbemSink?


Автор: TrashMaster 26.1.2014, 09:30
Встроил в программу поддержку скриптов 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 эта задача решена функцией http://autoit-script.ru/autoit3_docs/functions/ObjEvent.htm.
Код

$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 и в частности http://code.google.com/p/delphi-wmi-class-generator/source/browse/trunk/units/WbemScripting_TLB.pas

Надеюсь на помощь сообщества.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)