从Powershell调用带签名的COM方法(SAFEARRAY(Variant))

时间:2015-05-04 14:47:29

标签: powershell com

我有一个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中执行此操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我知道这是一篇非常老的文章,但是由于我遇到了类似情况并找到了该线程,所以只对其进行了更新。如果有人偶然发现此问题,他们可能会发现我的解决方案很有帮助。

尝试在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)