В чем разница между New-Object -ComObject в Powershell и CreateObject () в VB? - PullRequest
4 голосов
/ 13 апреля 2020

У меня есть вопрос о том, как Windows PowerShell работает при работе с Com Interop.

У меня есть стороннее приложение (назовем его ThirdPartyApp), которое предоставляет API, в который я могу обращаться.

Я могу рано связать его, например, в Excel или Visual Studio и общаться с ним «напрямую». Я могу позднее связать его в VBScript и по-прежнему говорить с ним «напрямую».

Под «напрямую» я имею в виду способ вызова свойств и методов, предоставляемых API, с использованием синтаксиса, например ThirdPartyApp.Name

Так что в VBScript я могу сделать:

Dim api : Set api = CreateObject("ThirdPartyApp.API")
WScript.Echo api.Name

В PowerShell, когда я делаю:

$api =  New-Object -ComObject ThirdPartyApp.API

Мне нужно использовать этот синтаксис для получения имени:

[System.__ComObject].InvokeMember('Name',[System.Reflection.BindingFlags]::GetProperty,$null,$api,$null)

Теперь я понимаю, что это как-то связано с тем, как был построен ThirdPartyApp.

Я знаю, что это не проблема кодирования, и я надеюсь, что я не получу немедленного голосования, но мой вопрос: почему я не могу общаться с этой сборкой способом VBScript при использовании Powershell? Чем New-Object -ComObject в Powershell отличается от CreateObject(identifier) в VBScript?

1 Ответ

0 голосов
/ 13 апреля 2020

Информация для Visual Basi c Программисты

Visual Basi c обеспечивает полную поддержку автоматизации. В следующей таблице показано, как операторы Visual Basi c преобразуются в API-интерфейсы OLE.

Операторы Visual Basi c API-интерфейсы OLE

CreateObject («ProgID») )

  • CLSIDFromProgID

  • CoCreateInstance

  • QueryInterface для получения интерфейса IDispatch.

GetObject («имя файла», «ProgID»)

  • CLSIDFromProgID

  • CoCreateInstance

  • QueryInterface для интерфейса IPersistFile.

  • Загрузка интерфейса IPersistFile.

  • QueryInterface to получить интерфейс IDispatch.

GetObject («имя файла») \

  • CreateBindCtx создает контекст привязки для последующих функций.

  • MkParseDisplayName возвращает дескриптор моникера для BindMoniker.

  • BindMoniker возвращает указатель на интерфейс IDispatch.

  • Разблокировать на дескрипторе прозвища.

  • Разблокировать в контексте.

GetObject («ProgID»)

  • CLSIDFromProgID

  • GetActiveObject для идентификатора класса.

  • QueryInterface для получения интерфейса IDispatch.

Dim x As Новый интерфейс

  • Найти CLSID для интерфейса.

  • CoCreateInstance

  • QueryInterface

Библиотека MSDN Октябрь 2001 г. Корпорация Майкрософт

См. https://docs.microsoft.com/en-us/windows/win32/api/combaseapi/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...