我需要为CivicFactory对象的NewCivicAddressReport事件实现一个事件处理程序。 以下代码使用事件处理程序命名约定,在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
- 它什么都没有返回,这意味着系统不相信这个对象有事件。
所以现在我怀疑:是否有可能将事件处理程序绑定到对象?
有人能告诉我正确的方法吗?
答案 0 :(得分:3)
如果没有可用的类型库,PowerShell对COM对象的效果不佳。这不仅仅是缺少的事件,如果您尝试使用get-member来探索实例,通常其他成员也不存在。总的来说,后期绑定支持遗憾地缺乏,但这可能是因为powershell使用“适配器”将对象的成员暴露给运行时的方式。您可以使用InvokeMember以后期方式调用成员。看看:
http://www.sorrell.mcleod.co.uk/Scotty/powershell/COMinterop.htm
我以为我已经完成了PSEventing但是看起来可能有一个v2.0的空间可以用于后期绑定事件。嗯。
我并不是说COM事件不起作用,它们工作得很好,但只有在有可用的互操作或类型库的情况下。
-Oisin (pseventing的作者)