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

Javascript 如何将字符串数组从ActiveX对象返回到JScript,javascript,com,activex,Javascript,Com,Activex,我需要调用Win32 API来获取一系列字符串,我想将这些字符串的数组返回给JavaScript。这适用于在本地计算机上运行的用于管理脚本的脚本,而不是用于web浏览器 COM对象的IDL文件具有我正在调用的接口,如下所示: HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); HRESULT GetArrayOfString([out,retval]SAFEARRAY(BSTR)*rgBstr

我需要调用Win32 API来获取一系列字符串,我想将这些字符串的数组返回给JavaScript。这适用于在本地计算机上运行的用于管理脚本的脚本,而不是用于web浏览器

COM对象的IDL文件具有我正在调用的接口,如下所示:

HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); HRESULT GetArrayOfString([out,retval]SAFEARRAY(BSTR)*rgBstrStringArray); 函数返回正确,但字符串在JavaScript中被分配给变量时“丢失”

问题是: 获取返回给JavaScript变量的字符串数组的正确方法是什么?
如果我没记错的话,您需要将
安全数组
包装成一个
变体,以便它能够通过,然后使用a在事物的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;
}
然后

这是正确的。COM脚本要求所有输出都是变体

事实上,它还要求所有的输入也必须是变体——请在您最喜欢的帮助文件中查看IDispatch的详细信息。只需考虑ATL和类似层(很可能就是您正在使用的层)的双接口实现的魔力,您就不必担心这一点。在调用实际方法之前,调用代码传递的输入变量将被转换为与方法签名匹配。

返回的ret.Detach()语句是否应为>pvarBstrStringArray=ret.Detach();谢谢
var jsFriendlyStrings = new VBArray( axOb.GetArrayOfStrings() ).toArray();