gpt4 book ai didi

javascript - 将多个变量从 COM 返回给 JavaScript

转载 作者:行者123 更新时间:2023-11-30 02:38:32 24 4
gpt4 key购买 nike

我在 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 绑定(bind)不支持 [out]参数 - 仅 [out, retval] (当然,其中只能有一个)。 JavaScript 通常没有引用传递的概念。

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

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

  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 是您的方法在对象上创建的属性的名称)。

关于javascript - 将多个变量从 COM 返回给 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com