5

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

我的 COM 对象的 IDL 文件具有我调用的接口:

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

该函数正确返回,但是在将字符串分配给 JavaScript 中的变量时,它们会“丢失”。

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

4

2 回答 2

6

如果我没记错的话,您需要将其包装SAFEARRAY在 aVARIANT中以使其通过,然后使用VBArray 对象在 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();
于 2008-09-05T04:04:12.930 回答
1

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

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

于 2008-09-15T21:16:08.510 回答