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

Я создал 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 ответа

В качестве эксперимента я создал $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++.

РЕДАКТИРОВАТЬ Я недавно нашел и проверил способ доступа к некоторым компонентам COM из PS, которые могут быть здесь интересны. Windows SDK поставляется с большим набором файлов IDL. Если вы хотите получить доступ к одному из них (а компонент не реализует IDispatch), вы можете скомпилировать IDL с MIDL, а затем использовать TLBIMP для создания сборки взаимодействия. Я успешно сделал это с 3 интерфейсами VSS Hardware Provider.

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

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

$obj = new-object -com MyLib.MyObj

$type = $obj.gettype()

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

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

Вот пример, где я вызываю 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
Другие вопросы по тегам