Поддерживает ли PowerShell 2.0 обработчик событий COM? - PullRequest
4 голосов
/ 28 апреля 2011

Мне нужно реализовать обработчик событий для этого события NewCivicAddressReport объекта CivicFactory.Следующий код, использующий соглашение об именах обработчиков событий, прекрасно работает в VBScript:

Dim CivicFactory
Set CivicFactory = WScript.CreateObject("LocationDisp.CivicAddressReportFactory", "CivicFactory_")

Function CivicFactory_NewCivicAddressReport(report)
    MsgBox "Location changed!"
End Function

Однако в PowerShell следующий код завершается ошибкой:

$CivicFactory = new-object -comObject LocationDisp.CivicAddressReportFactory
Register-ObjectEvent $CivicFactory -EventName "NewCivicAddressReport" -Action ({ echo "hello" })

Сообщение об ошибке: Register-ObjectEvent:Не могу зарегистрироваться на событие.Событие с именем 'NewCivicAddressReport' не существует.

Я также попытался $CivicFactory.add_NewCivicAddressRerport( {"hello"} ), и оно тоже не удалось.

Поэтому я обратился к $CivicFactory | Get-Member: оно вернуло свои методы и свойства, ноНЕТ событий.

Так что я подозреваю, что PowerShell не очень хорошо поддерживает события COM.Я установил pseventing snapin и попробовал Get-EventBinding CivicFactory -IncludeUnboundEvents | Format-Table -Auto - он ничего не возвратил, что означает, что система не верит, что у этого объекта есть события.

Так что теперь я сомневаюсь: можно ли вообще связать событиеобработчик объекта?

Может кто-нибудь показать мне правильный путь?

1 Ответ

3 голосов
/ 28 апреля 2011

PowerShell не очень хорошо работает с COM-объектами, если нет доступной библиотеки типов. Отсутствуют не только события, обычно других участников тоже нет, если вы пытаетесь использовать get-member для изучения экземпляра. В целом, поддержка позднего связывания, к сожалению, отсутствует, но это, вероятно, из-за того, что powershell использует «адаптеры» для представления членов объектов во время выполнения. Вы можете вызывать участников с поздним связыванием, используя InvokeMember. Взгляните на:

http://www.sorrell.mcleod.co.uk/Scotty/powershell/COMinterop.htm

Я думал, что закончил PSEventing, но, похоже, есть место для версии 2.0, которая может работать с событиями с поздним связыванием. Хммм.

Я не говорю, что COM-события не работают, они прекрасно работают, но только при наличии взаимодействия или библиотеки типов.

-Oisin (автор pseventing)

...