2011-04-28 74 views
4

我需要为CivicFactory对象的NewCivicAddressReport事件实现事件处理程序。 这下面的代码,使用事件处理程序命名约定,完美的作品在VBScript:PowerShell 2.0是否支持COM事件处理程序?

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" }) 

错误消息:注册-ObjectEvent:不能注册事件。名称为“NewCivicAddressReport”的事件不存在。

我也试过$CivicFactory.add_NewCivicAddressRerport({"hello"}),也失败了。

所以我转向$CivicFactory | Get-Member:它确实返回它的方法和属性,但没有事件。

所以我怀疑PowerShell不太支持COM事件。我安装了pseventing snapin并尝试Get-EventBinding CivicFactory -IncludeUnboundEvents | Format-Table -Auto - 它什么都没有返回,这意味着系统不相信这个对象有事件。

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

任何人都可以告诉我正确的方法吗?

回答

3

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

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

我还以为我是用PSEventing完成,但它似乎有可能余地V2.0可以与后期绑定事件工作。嗯。

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

-Oisin (pseventing的作者)

+0

请更新PSeventing! SetACL的COM版本(http://helgeklein.com/setacl)也遇到OP描述的问题。 – 2011-05-11 08:16:02