2011-04-28 3 views
4

CivicFactory 객체의이 NewCivicAddressReport 이벤트에 대한 이벤트 핸들러를 구현해야합니다. 이 다음 코드는, 명명 규칙 이벤트 핸들러를 사용하여 VBScript로 완벽하게 작동합니다 : PowerShell의 그러나PowerShell 2.0은 COM 이벤트 처리기를 지원합니까?

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

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

를 다음 코드가 실패 :

$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 스냅인을 설치하고 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 이벤트가 작동하지 않는다고 말하는 것은 아닙니다. 사용 가능한 interop 또는 유형 라이브러리가있는 경우에만 잘 작동합니다.

(pseventing의 저자) PSeventing이

+0

업데이트하시기 바랍니다 -Oisin! SetACL의 COM 버전 (http://helgeklein.com/setacl)도 OP에서 설명한 문제로 어려움을 겪고 있습니다. –

관련 문제