【问题标题】:What is the difference between New-Object -ComObject in Powershell and CreateObject() in VB?Powershell 中的 New-Object -ComObject 和 VB 中的 CreateObject() 有什么区别?
【发布时间】:2020-07-25 11:28:07
【问题描述】:

我有一个关于 Windows PowerShell 在处理 Com Interop 时如何工作的问题。

我有一个第 3 方应用程序(我们称之为 ThirdPartyApp),它公开了一个我可以调用的 API。

我可以提前绑定它,例如Excel 或 Visual Studio 并“直接”与其交谈。我可以在 VBScript 中后期绑定它,并且仍然“直接”与它对话。

“直接”是指我可以使用 ThirdPartyApp.Name 之类的语法调用 API 公开的属性和方法的方式

所以在 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 的构建方式有关。

我知道这不是编码问题,我希望我不会立即被否决,但我的问题是:为什么我不能在使用 Powershell 时以 VBScript 方式与这个程序集对话? Powershell 中的New-Object -ComObject 与VBScript 中的CreateObject(identifier) 有何不同?

【问题讨论】:

  • 请更新问题以澄清您使用的是 Windows PowerShell 还是 PowerShell [Core]。
  • 完成。这是关于 Windows Powershell 的。它是关于 COM 的,那只是 Windows 的,对吧?不过没关系。
  • 感谢您的澄清。 PowerShell [Core] 也在 Windows 上运行,并且在某些领域缺乏它的 COM 支持,因此我的问题。根据标签“powershell”的指导,将暗示 Windows PowerShell - 对于 PowerShell [Core] 问题建议使用“powershell-core”,但我怀疑随着 PowerShell [Core] 的接管,这条线将越来越模糊。

标签: powershell vbscript


【解决方案1】:

Visual Basic 程序员须知

Visual Basic 提供对自动化的全面支持。下表列出了 Visual Basic 语句如何转换为 OLE API。

Visual Basic 语句 OLE API

CreateObject(“ProgID”)

  • CLSIDFromProgID

  • CoCreateInstance

  • QueryInterface 获取 IDispatch 接口。

GetObject(“文件名”、“ProgID”)

  • CLSIDFromProgID

  • CoCreateInstance

  • IPersistFile 接口的QueryInterface。

  • 在 IPersistFile 接口上加载。

  • QueryInterface 获取 IDispatch 接口。

GetObject(“文件名”)\

  • CreateBindCtx 为后续函数创建绑定上下文。

  • MkParseDisplayName 返回 BindMoniker 的名字对象句柄。

  • BindMoniker 返回一个指向 IDispatch 接口的指针。

  • 在名字句柄上释放。

  • 根据上下文发布。

GetObject(“ProgID”)

  • CLSIDFromProgID

  • GetActiveObject 类 ID。

  • QueryInterface 获取 IDispatch 接口。

Dim x As New 界面

  • 查找接口的 CLSID。

  • CoCreateInstance

  • 查询接口

MSDN 库 2001 年 10 月 Microsoft Corp.

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

【讨论】:

  • 感谢您提供的信息,但不包括 PowerShell 位
  • 你为什么要向 Basic 程序员询问非 Basic 的东西。
  • 因为我想了解区别,所以两个标签。
  • 我告诉过你基本答案。
  • 我对此表示感谢。仍然困扰我的问题是,如果 VB 中的“QueryInterface to get IDispatch interface”足以启用对该接口中成员的“直接”调用,为什么我(有时,取决于应用程序)必须使用相当复杂的语法在 Powershell 中?
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2014-02-10
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2018-06-04
  • 2018-08-02
相关资源
最近更新 更多