Поддерживает ли PowerShell 2.0 обработчик событий COM?

Мне нужно реализовать обработчик событий для этого события 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. Я установил оснастку псевдонимов и попробовал Get-EventBinding CivicFactory -IncludeUnboundEvents | Format-Table -Auto - ничего не вернуло, что означает, что система не верит, что у этого объекта есть события.

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

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


person Charlie    schedule 28.04.2011    source источник


Ответы (1)


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

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

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

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

-Oisin (автор псевентинга)

person x0n    schedule 28.04.2011
comment
Пожалуйста, обновите PSeventing! Версия SetACL для COM (helgeklein.com/setacl) также страдает от проблемы, описанной OP. - person Helge Klein; 11.05.2011