Как сделать интерфейс запросов 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