OCX / COM: некоторые методы не отображаются в PowerShell - PullRequest
2 голосов
/ 17 марта 2011

У меня есть элемент управления ActiveX SetACL.ocx. Он зарегистрирован в моей системе, и я могу использовать его из C # (Visual Studio 2010) без проблем. В обозревателе объектов Visual Studio отображаются все методы.

Однако в PowerShell около трети методов не отображаются. Если я пытаюсь вызвать один из отсутствующих методов, я получаю MethodNotFound:

PS C:\> $setacl = New-Object -ComObject setacl.setaclctrl.1
PS C:\> $setacl | Get-Member

   TypeName: System.__ComObject#{85869435-0ee3-440b-bf69-6c52c6638073}

Name                   MemberType Definition
----                   ---------- ----------
AddACE                 Method     int AddACE (string, bool, string, int, bool, int, int)
AddDomain              Method     int AddDomain (string, string, int, bool, bool)
AddTrustee             Method     int AddTrustee (string, string, bool, bool, int, bool, bool)
GetLastAPIError        Method     int GetLastAPIError ()
GetLastAPIErrorMessage Method     string ()
GetLastListOutput      Method     string GetLastListOutput ()
GetResourceString      Method     string GetResourceString (int)
Reset                  Method     void Reset ()
Run                    Method     int Run ()
SetAction              Method     int SetAction (int)
SetListOptions         Method     int SetListOptions (int, int, bool, int)
SetLogFile             Method     int SetLogFile (string)
SetOwner               Method     int SetOwner (string, bool)
SetPrimaryGroup        Method     int SetPrimaryGroup (string, bool)


PS C:\> $setacl.SetObject("test", 1)
Method invocation failed because [System.__ComObject#{85869435-0ee3-440b-bf69-6c52c6638073}] doesn't contain a method named 'SetObject'.
At line:1 char:18
+ $setacl.SetObject <<<< ("test", 1)
    + CategoryInfo          : InvalidOperation: (SetObject:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Есть ли какие-либо подсказки относительно того, почему PowerShell отображает не все доступные методы, а браузер объектов Visual Studio?

Я пробовал 32- и 64-разрядные версии PowerShell.

Обновление 1:

Вот подпись одного из отсутствующих методов из файла ODL (да, у меня есть полный исходный код OCX, я его автор):

[id(2), helpstring ("Set the object on which all actions are to be performed")]
LONG SetObject(BSTR sObjectPath, LONG nObjectType);

Обновление 2:

Вот исходный код OCX , доступный для просмотра в sourceforge.

Обновление 3:

OCX можно загрузить из sourceforge . Он включен в файл SetACL 2.2.0.zip.

Обновление 4 - возможное решение:

Смена методов с DISPID 1-7 на более высокие DISPIDS и введение 7 новых фиктивных методов с DISPIDS 1-7, кажется, делают свое дело. Теперь все появляется в PoSh - кроме фиктивных методов.

У кого-нибудь есть объяснение этому?

Ответы [ 6 ]

1 голос
/ 17 марта 2011

Глядя на файл IDL из проекта здесь , выясняется, что каждый член вашего интерфейса _DSetACL с DISPID ниже 8 игнорируется.Может быть, попробуйте запустить DISPID с более высоким индексом, например, 100?Я вспоминаю некоторые «магические» значения dispid, но я подумал, что это очень высокие значения, а не низкие, могут быть ошибочными ...

0 голосов
/ 28 марта 2011

Это похоже на ограничение PowerShell. Есть два обходных пути, упомянутых в блоге здесь .

0 голосов
/ 21 марта 2011

Такого рода вещи обычно происходят, когда нет библиотеки типов.Когда это происходит, вы обычно пробуете что-то вроде этого:

$bindingFlags = [System.Reflection.BindingFlags]::InvokeMethod
[System.__ComObject].InvokeMember('SetObject', $bindingFlags , $null, $setacl, 
                                  @("test", 1))
0 голосов
/ 17 марта 2011

Еще один удар в темноте ...

Get-Member -Force -View All

Также убедитесь, что вы получаете правильную версию объекта.

0 голосов
/ 17 марта 2011

Попробуйте Get-Member -Static? Угадай еще раз.

0 голосов
/ 17 марта 2011

Попробуйте параметр -force для Get-Member?

Общее предположение BTW ...

...