【问题标题】:How do I return an array of strings from an ActiveX object to JScript如何将 ActiveX 对象中的字符串数组返回到 JScript
【发布时间】:2010-09-07 21:26:10
【问题描述】:

我需要调用 Win32 API 来获取一系列字符串,并且我想将这些字符串的数组返回给 JavaScript。这适用于在本地计算机上运行的用于管理脚本的脚本,而不适用于 Web 浏览器。

我的 COM 对象的 IDL 文件具有我正在调用的接口:

HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);

函数正确返回,但字符串在分配给 JavaScript 中的变量时会“丢失”。

问题是: 将字符串数组返回到 JavaScript 变量的正确方法是什么?

【问题讨论】:

    标签: javascript com activex


    【解决方案1】:

    如果我没记错的话,您需要将 SAFEARRAY 包装在 VARIANT 中以使其通过,然后使用 VBArray object 在 JS 方面解压:

    HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
    {
       // ...
    
       _variant_t ret;
       ret.vt = VT_ARRAY|VT_VARIANT;
       ret.parray = rgBstrStringArray;
       *pvarBstrStringArray = ret.Detach();
       return S_OK;
    }
    

    然后

    var jsFriendlyStrings = new VBArray( axOb.GetArrayOfStrings() ).toArray();
    

    【讨论】:

    • return ret.Detach() 语句实际上应该是 > pvarBstrStringArray = ret.Detach();谢谢
    【解决方案2】:

    Shog9 是正确的。 COM 脚本要求所有输出都是变体。

    事实上,它还要求所有 INPUTs 也是 VARIANTS —— 请在您最喜欢的帮助文件中查看 IDispatch 的令人讨厌的细节。只是认为 ATL 和类似层(很可能是您正在使用的层)实现的双接口的魔力,您不必担心这一点。在调用您的实际方法之前,调用代码传递的输入 VARIANT 将被转换为匹配您的方法签名。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2014-12-11
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多