Return 从 COM 到 JavaScript 的多个变量
Return multiple variables to JavaScript from 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不会打这个球。为什么?如果不是,那么您如何 return 从 COM 到 JavaScript 的多个值。
不过,对于这项特殊的工作,我 return 编辑了一个 JSON。
JavaScript/COM 绑定不支持 [out]
参数——仅支持 [out, retval]
(当然,只能有一个)。 JavaScript 通常没有传递引用的概念。
有几种方法可以让您更接近目标。
Return 两个字符串的 SAFEARRAY
。在 JavaScript 中,通过 VBArray
object.
消耗它
使用两个 BSTR
属性实现一个简单的 COM 对象,通过 [out, retval] IDispatch**
.
[= 创建和 return 该对象的一个实例40=]
将IDispatch*
作为[in]
参数,通过IDispatchEx::GetDispID(fdexNameEnsure)
在其上设置一个新的属性。 JavaScript 会像这样消耗它:
.
var outParam = {};
var result = obj.MultipleReturn(outParam);
var secondResult = outParam.value;
(其中 value
是您的方法在对象上创建的 属性 的名称)。
我在 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不会打这个球。为什么?如果不是,那么您如何 return 从 COM 到 JavaScript 的多个值。 不过,对于这项特殊的工作,我 return 编辑了一个 JSON。
JavaScript/COM 绑定不支持 [out]
参数——仅支持 [out, retval]
(当然,只能有一个)。 JavaScript 通常没有传递引用的概念。
有几种方法可以让您更接近目标。
Return 两个字符串的
SAFEARRAY
。在 JavaScript 中,通过VBArray
object. 消耗它
使用两个
[= 创建和 return 该对象的一个实例40=]BSTR
属性实现一个简单的 COM 对象,通过[out, retval] IDispatch**
.将
IDispatch*
作为[in]
参数,通过IDispatchEx::GetDispID(fdexNameEnsure)
在其上设置一个新的属性。 JavaScript 会像这样消耗它:
.
var outParam = {};
var result = obj.MultipleReturn(outParam);
var secondResult = outParam.value;
(其中 value
是您的方法在对象上创建的 属性 的名称)。