从COM返回多个变量到JavaScript

时间:2015-06-10 13:50:25

标签: javascript c++ com

我在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。

1 个答案:

答案 0 :(得分:3)

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

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

  1. 返回两个字符串SAFEARRAY。在JavaScript中,通过VBArray object消费它。

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

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

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

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