【问题标题】:Call a COM method with signature (SAFEARRAY(Variant)) from Powershell从 Powershell 调用带有签名 (SAFEARRAY(Variant)) 的 COM 方法
【发布时间】:2015-07-14 00:20:33
【问题描述】:

我有一个 COM 对象,其中包含我想从 Powershell 创建和调用的方法。

从源码中我知道方法签名是:

private DataSet MethodName(string connectionString, int userID, string location, int specID)

当我在 Powershell 中创建对象时:

$obj = New-Object -ComObject My.ComObjectClass
$obj | Get-Member

签名看起来像:

MethodName               Method     _Recordset_Deprecated MethodName (SAFEARRAY(Variant))   

所以我创建了一个数组并将其传递给方法:

$MyArgs = "data source=Server;Initial catalog=kickassDB",1234,"flavortown",56
$obj.MethodName([ref]$MyArgs)

但这不起作用。我收到一个错误:

Exception calling "MethodName" with "1" argument(s): "Type mismatch"

我认为我的问题是我的数组充满了常规字符串和整数值,我需要创建 VARIANT,但我不知道如何在 Powershell 中执行此操作。

有什么想法吗?

【问题讨论】:

  • 使用此语法创建 $MyArgs,默认创建一个变体数组!如果您只是忽略签名以及 powershell 如何显示它怎么办。如果你只是调用 $Obj.MethodeName("data source=Server;Initial catalog=kickassDB",1234,"flavortown",56) 怎么办?
  • @xMRi 试过了。没用。
  • 问题正文中的异常文本几乎是我得到的所有内容。使用“1”参数调用“MethodName”的异常:“类型不匹配”在 U:\testScript.ps1:4 char:15 + $obj.MethodName

标签: powershell com


【解决方案1】:

我知道这是一篇很老的帖子,但我只是更新它,因为我遇到了类似的情况并找到了这个帖子。如果其他人偶然发现这一点,他们可能会发现我的解决方案很有帮助。

在 PowerShell v7 下尝试使用 HTMLFile COM 对象的 write 方法时收到以下错误。这不是 PowerShell v5 的问题。对于 PS5,该方法需要一个 System.Object[] 参数。对于 PS7,它需要一个 SAFEARRAY(Variant) 参数。

“类型不匹配。(0x80020005 (DISP_E_TYPEMISMATCH))”

我能够使用 jedigo 的解决方案 here 并提供字节数组而不是字符串来解决我的问题。所以最终工作的代码类似于:

$H = New-Object -ComObject "HTMLFile"
$S = '<p>Some Text</p>'
$B = [System.Text.Encoding]::Unicode.GetBytes($S)
$H.write($B)

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2012-08-03
    • 2017-03-20
    • 2012-03-12
    • 2011-07-29
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多