Powershell 中的 New-Object -ComObject 和 VB 中的 CreateObject() 有什么区别?

Rno*_*Rno 5 vbscript powershell

我有一个关于 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
Run Code Online (Sandbox Code Playgroud)

在 PowerShell 中,当我这样做时:

$api =  New-Object -ComObject ThirdPartyApp.API
Run Code Online (Sandbox Code Playgroud)

我必须使用以下语法来获取名称:

[System.__ComObject].InvokeMember('Name',[System.Reflection.BindingFlags]::GetProperty,$null,$api,$null)
Run Code Online (Sandbox Code Playgroud)

ThirdPartyApp现在,我明白这与建造方式有关。

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

小智 0

给 Visual Basic 程序员的信息

\n\n

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

\n\n

Visual Basic 语句 OLE API

\n\n

CreateObject (\xe2\x80\x9cProgID\xe2\x80\x9d)

\n\n
    \n
  • CLSID来自ProgID

  • \n
  • 共同创建实例

  • \n
  • QueryInterface 获取 IDispatch 接口。

  • \n
\n\n

GetObject(\xe2\x80\x9c文件名\xe2\x80\x9d,\xe2\x80\x9cProgID\xe2\x80\x9d)

\n\n
    \n
  • CLSID来自ProgID

  • \n
  • 共同创建实例

  • \n
  • IPersistFile 接口的 QueryInterface。

  • \n
  • 在 IPersistFile 接口上加载。

  • \n
  • QueryInterface 获取 IDispatch 接口。

  • \n
\n\n

GetObject (\xe2\x80\x9c 文件名\xe2\x80\x9d) \\

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

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

  • \n
  • BindMoniker 返回指向 IDispatch 接口的指针。

  • \n
  • 释放名称手柄。

  • \n
  • 根据上下文发布。

  • \n
\n\n

GetObject(\xe2\x80\x9cProgID\xe2\x80\x9d)

\n\n
    \n
  • CLSID来自ProgID

  • \n
  • GetActiveObject 类 ID。

  • \n
  • QueryInterface 获取 IDispatch 接口。

  • \n
\n\n

变暗x为新界面

\n\n
    \n
  • 查找接口的 CLSID。

  • \n
  • 共同创建实例

  • \n
  • 查询接口

  • \n
\n\n

MSDN 库 2001 年 10 月 Microsoft Corp.

\n\n

请参阅https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/

\n