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