【问题标题】:Calling VBScript Procedure results type mismatch error调用 VBScript Procedure 结果类型不匹配错误
【发布时间】:2012-11-21 06:09:04
【问题描述】:

我的一个 COM 对象有一个以下成员,它在第二个参数中返回字节数组及其长度。

HRESULT GetBinaryData([out] VARIANT *pVal, [out] long *pLen);

仅供参考,

**Part of implementation is as follows:**
....
VariantInit(pVal);
pVal->vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = ARRAY_LBOUND;
rgsabound[0].cElements = (ULONG)len;
pVal->parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
....

我试图在 VBScript 中调用这个成员,但在我所有的试验中都失败了。这是我的 vbscript 代码 sn-p:

Set op = CreateObject("myserver")
dim bytearray()
op.GetBinaryData bytearray, bytearray_len

但在第 3 行,遇到类型不匹配错误...

如何将过程中的结果放入我的 vbscript 变量中?

提前致谢。

【问题讨论】:

    标签: com vbscript variant


    【解决方案1】:

    考虑在 COM 级别使用 retval

    HRESULT GetBinaryData([out, retval] VARIANT *pVal);
    

    由于返回值为SAFEARRAY,您现有的 C++ 仍然可以工作。在这种情况下,SAFEARRAY 足以返回给调用者数组和长度。即您的 C++ 代码保持原样。

    您的 VBScript 代码变为:

    Option Explicit
    Set op = CreateObject("myserver")
    Dim byteArray, lenArray
    byteArray = op.GetBinaryData()
    lenArray = UBound(byteArray) - LBound(byteArray) + 1
    

    虽然您只能通过SAFEARRAY 或等效对象(例如IXMLDOMDocument)拥有一个retval,但您可以为VBScript 打包多个返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2018-01-16
      • 1970-01-01
      相关资源
      最近更新 更多