从COM返回多个变量到JavaScript

Return multiple variables to JavaScript from COM

本文关键字:变量 JavaScript COM 返回      更新时间:2023-10-16

我在disp接口中有如下所示的COM函数,

[id(1)] HRESULT MultipleReturn([out]BSTR* arg1, [out, retval] BSTR* arg2);

实现为

STDMETHODIMP SomeCoolObject::MultipleReturn(BSTR* arg1, BSTR* arg2)
{
    *arg1 = SysAllocString(L"test1");
    *arg2 = SysAllocString(L"test2");
    return S_OK;
}

在Python中我可以把它叫做

import comtypes.client as cc
obj = cc.CreateObject('SomeCoolObject')
a = obj.MultipleReturn()
print(a) # gives (u'test1', u'test2'), Python, I see you don't bite :)

JavaScript相同

var obj = new ActiveXObject("SomeCoolObject")
// this gives error, kind of obvious
// 'Wrong number of arguments or invalid property assignment'
// var val = obj.MultipleReturn();
var a = "holaaa!";
var val = obj.MultipleReturn(a);
alert(val); // gives "test2"
alert(a);   // gives "holaaa!", may be could have given "test1"

这证明,JavaScript不会玩这个球。为什么?如果不是,那么如何从COM向JavaScript返回多个值?对于这个特定的工作,我返回了一个JSON。

JavaScript/COM绑定不支持[out]参数,只支持[out, retval]参数(当然,只能有一个)。JavaScript通常没有引用传递的概念。

有几种方法可以让你更接近你的目标。

  1. 返回两个字符串的SAFEARRAY。在JavaScript中,通过VBArray对象来使用它。

  2. 实现一个具有两个BSTR属性的简单COM对象,通过[out, retval] IDispatch**创建并返回该对象的实例。

  3. IDispatch*[in]参数,通过IDispatchEx::GetDispID(fdexNameEnsure)为其设置一个新属性。JavaScript会这样使用它:

.

var outParam = {};
var result = obj.MultipleReturn(outParam);
var secondResult = outParam.value;

(其中value是你的方法在对象上创建的属性的名称)