如何从ActiveX对象返回字符串数组到JScript

如何从ActiveX对象返回字符串数组到JScript

问题描述:

我需要调用一个Win32 API来获取一系列字符串,并且我想将这些字符串的数组返回给JavaScript。这是用于管理脚本的本地机器上运行的脚本,不适用于Web浏览器。如何从ActiveX对象返回字符串数组到JScript

的COM对象我的IDL文件中有我打电话到的接口:

 
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); 

函数正确返回,但字符串得到“丢失”时,他们被分配到一个变量JavaScript的。

问题是: 将字符串数组返回给JavaScript变量的正确方法是什么?

如果我记错,你需要换一个VARIANTSAFEARRAY,以便它打通,然后用VBArray object把它解压到对事物的JS方:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray) 
{ 
    // ... 

    _variant_t ret; 
    ret.vt = VT_ARRAY|VT_VARIANT; 
    ret.parray = rgBstrStringArray; 
    *pvarBstrStringArray = ret.Detach(); 
    return S_OK; 
} 

然后

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray(); 
+0

应该返回ret.Detach()语句实际上是 > pvarBstrStringArray = ret.Detach(); 谢谢 – Mark 2008-12-13 00:16:42

Shog9 是正确的。 COM脚本要求所有输出都是VARIANTS。

实际上,它也要求所有的INPUTs都是VARIANTS--在你最喜欢的帮助文件中查看IDispatch的令人讨厌的细节。它只被认为是ATL和类似图层(这很可能是你正在使用的)双接口实现的魔力,你不必担心这一点。在调用实际方法之前,调用代码传递的输入VARIANT会被转换为匹配您的方法签名。