Добрый день. Подскажите пожалуйста как перевести код Vbs на код Autoit.
До этого, проблем с WMI не было. Но вот столкнулся с такой проблемой.
Не могу обработать события от WMI в асинхронном режиме.
Для того чтобы обработать события в данном режиме, необходима процедура (типа Sub ... End Sub) обработки события "OnObjectReady". Но в Autoit отсутствует такая конструкция. Запихнуть данную конструкцию (Sub ... End Sub) в функцию не удается. Чуть ниже два скрипта.
Один на Vbs - рабочий, другой на Autoit - не рабочий. Назначение скрипта: Оповещать пользователя о запуске нового процесса. Прошу не предлагать другие способы выполнения задачи скрипта. Интересует именно обработка событий WMI в асинхронном режиме (в синхронном режиме более менее все понятно).
До этого, проблем с WMI не было. Но вот столкнулся с такой проблемой.
Не могу обработать события от WMI в асинхронном режиме.
Для того чтобы обработать события в данном режиме, необходима процедура (типа Sub ... End Sub) обработки события "OnObjectReady". Но в Autoit отсутствует такая конструкция. Запихнуть данную конструкцию (Sub ... End Sub) в функцию не удается. Чуть ниже два скрипта.
Один на Vbs - рабочий, другой на Autoit - не рабочий. Назначение скрипта: Оповещать пользователя о запуске нового процесса. Прошу не предлагать другие способы выполнения задачи скрипта. Интересует именно обработка событий WMI в асинхронном режиме (в синхронном режиме более менее все понятно).
Код:
strComputer = "."
'подключение к пространству имён
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
'создание объекта синхронизации MySink
Set MySink = WScript.CreateObject( "WbemScripting.SWbemSink","SINK_")
'асинхронный запрос
objWMIservice.ExecNotificationQueryAsync MySink, _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"
'цикл ожидания для получения всех событий о создании процессов
WScript.Echo "Waiting for events..."
While (True)
Wscript.Sleep(1000)
Wend
'процедура обработки события OnObjectReady (Эта злосчастная процедура)
Sub SINK_OnObjectReady(objObject, objAsyncContext)
Wscript.Echo objObject.TargetInstance.Name
End Sub
Код:
;подключение к пространству имён
$WMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
;создание объекта синхронизации
$MySink = ObjCreate( "WbemScripting.SWbemSink","SINK_")
;асинхронный запрос
$WMIService.ExecNotificationQueryAsync ($MySink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
; Ожидаем события
While 1
Sleep(1000)
Wend
;обработчик события OnObjectReady
Func SINK_OnObjectReady($objWbemObject, $objWbemAsyncContext)
$Name = $objWbemObject.TargetInstance.Name
MsgBox(1,"", $Name)
EndFunc