Как сделать интерфейс запросов Powershell для COM-объекта - PullRequest
9 голосов
/ 07 декабря 2011

Я создал COM-объект с помощью Powershell:

$obj = new-object -com MyLib.MyObj

Затем мне нужно запросить интерфейс "MyLib.MyInterface" для этого объекта, но я не знаю, как это сделать с помощью PowerShell.

В слове заказа Предположим, у меня есть код C ++ ниже

CComPtr<IInterface1> pInterface1;
CComPtr<IInterface2> pInterface2;
pInterface1->CoCreateInstance(CLSID_XXXX);   //in PowerShell: $obj = new-object -com MyLib.MyObj
pInterface1->QueryInterface(IID_YYYY, &pInterface2); //how to do this in PowerShell?

Как мне сделать ту же работу с Powershell

Есть комментарии?

Спасибо

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Если я понял ваши потребности, попробуйте это:

$obj = new-object -com MyLib.MyObj

$type = $obj.gettype()

$type.GetInterfaces() # give a list of interfaces for the type

надежда может быть отправной точкой

3 голосов
/ 24 сентября 2015

В качестве эксперимента я создал $obj=new-object -com file. («file» - это progid для COM-класса FileMoniker). [Runtime.InteropServices.marshal]::GetIUnknownForObject($obj) дает мне System.IntPtr на моем компьютере с Windows 2008R2. Я смог передать это значение вместе с GUID для IMoniker в [Runtime.InteropServices.marshal] :: QueryInterface, и я получил то же значение (то есть тот же указатель), что и GetIUnknownForObject. Так что я смог запросить интерфейс.

Однако я не уверен, что хорошего от Powershell. В [Runtime.InteropServices.marshal] есть много других методов, которые могут быть интересны для работы с COM из PS. Но в целом работа с COM-объектами в PS сильно отличается от работы с ними в C ++.

EDIT Недавно я нашел и проверил способ доступа к некоторым COM-компонентам из PS, который может быть здесь интересен. Windows SDK поставляется с большим набором файлов IDL. Если вы хотите получить доступ к одному из них (а компонент не реализует IDispatch), вы можете скомпилировать IDL с MIDL, а затем использовать TLBIMP для создания сборки взаимодействия. Я успешно сделал это с 3 интерфейсами VSS Hardware Provider.

Я также узнал, что вы можете использовать [type] :: GetTypeFromCLSID для получения типа из CLSID. И в зависимости от компонента вы можете создать его экземпляр.

2 голосов
/ 07 декабря 2011

Вот пример, где я вызываю Word (см. Обзор модели объектов Word ) COM-объект:

# Create Word Object  
$wrd = new-object -com "word.application"

# Make Word Visible  
$wrd.visible = $true

# Open a document   
$doc = $wrd.documents.open("C:\silogix\silogix.doc")

Чтобы увидеть свойства и методы вашего COM-объекта, вы можете использовать:

$obj | Get-Member
...