PowerShell 2.0是否支持COM事件处理程序?

时间:2011-04-28 13:13:06

标签: events object com powershell handler

我需要为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 - 它什么都没有返回,这意味着系统不相信这个对象有事件。

所以现在我怀疑:是否有可能将事件处理程序绑定到对象?

有人能告诉我正确的方法吗?

1 个答案:

答案 0 :(得分:3)

如果没有可用的类型库,PowerShell对COM对象的效果不佳。这不仅仅是缺少的事件,如果您尝试使用get-member来探索实例,通常其他成员也不存在。总的来说,后期绑定支持遗憾地缺乏,但这可能是因为powershell使用“适配器”将对象的成员暴露给运行时的方式。您可以使用InvokeMember以后期方式调用成员。看看:

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

我以为我已经完成了PSEventing但是看起来可能有一个v2.0的空间可以用于后期绑定事件。嗯。

我并不是说COM事件不起作用,它们工作得很好,但只有在有可用的互操作或类型库的情况下。

-Oisin (pseventing的作者)