从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不会玩这个球。为什么?如果不是,那么如何从COM向JavaScript返回多个值?对于这个特定的工作,我返回了一个JSON。
JavaScript/COM绑定不支持[out]
参数,只支持[out, retval]
参数(当然,只能有一个)。JavaScript通常没有引用传递的概念。
有几种方法可以让你更接近你的目标。
-
返回两个字符串的
SAFEARRAY
。在JavaScript中,通过VBArray
对象来使用它。 -
实现一个具有两个
BSTR
属性的简单COM对象,通过[out, retval] IDispatch**
创建并返回该对象的实例。 -
以
IDispatch*
为[in]
参数,通过IDispatchEx::GetDispID(fdexNameEnsure)
为其设置一个新属性。JavaScript会这样使用它:
.
var outParam = {};
var result = obj.MultipleReturn(outParam);
var secondResult = outParam.value;
(其中value
是你的方法在对象上创建的属性的名称)
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- C++ 对 JavaScript 变量的引用
- 视觉效果如何使用awesomium读取JavaScript变量?C
- javascript中的静态私有变量用于自己的库
- 获取 javascript/HTML5 应用程序之外的变量
- Javascript映射变量
- 将javascript变量值传递给c++变量
- 如何在PPAPI中将变量从JavaScript传递到c++
- 从COM返回多个变量到JavaScript