| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как заполнить обработчик событий SWbemSink? |
| Автор: TrashMaster 26.1.2014, 09:30 | ||||||||||
Встроил в программу поддержку скриптов Microsoft Windows Script Host. Хочу немного расширить возможности поддержкой асинхронных событий. Работает через OLE Automation:
IScriptControl из MSScriptControl_TLB, msscript.ocx IWshShell3 (WScript.Shell) из IWshRuntimeLibrary_TLB, wshom.ocx В скриптах, запускаемых интерпретатором wscript.exe, объект "WScript" имеет метод CreateObject, который создает объект "WbemScripting.SWbemSink" и привязывает к его событиям процедуры из сценария. Затем эти процедуры используются в событиях обратного вызова WMI.
Вопрос в реализации этой функции для OLE, где у WScript.Shell такого метода нет. Сам скрипт запускается в отдельном потоке и в целом выполняется асинхронно, но без нормальной поддержки SWbemSink нет возможности отслеживать несколько событий системы через WMI одновременно из одного сценария. Работают все необходимые объекты и можно передавать процедуру как IDispatch
или добраться до процедуры как IScriptProcedure через ScriptControl.Procedures.Item[N]. Объект "WbemScripting.SWbemSink" спокойно создается просто через CreateObject, но естественно, он еще не привязан к процедурам скрипта. В autoit эта задача решена функцией http://autoit-script.ru/autoit3_docs/functions/ObjEvent.htm.
Т.е. без дополнительных программных прослоек, "заряжается" стандартный объект ОС. Проблема, как забраться в ISWbemSink из Delphi? Понятно, что через Invoke, но не знаю какие параметры передавать. Може есть какой вспомогательный объект в WMI, который это может?
Полная всей объектной модели WMI и в частности http://code.google.com/p/delphi-wmi-class-generator/source/browse/trunk/units/WbemScripting_TLB.pas Надеюсь на помощь сообщества. |