如何将 ActiveX 对象中的字符串数组返回到 JScript
-
09-06-2019 - |
题
我需要调用 Win32 API 来获取一系列字符串,并且我想将这些字符串的数组返回给 JavaScript。这是针对在本地计算机上运行的管理脚本的脚本,不适用于 Web 浏览器。
我的 COM 对象的 IDL 文件具有我调用的接口:
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);
该函数正确返回,但当字符串被分配给 JavaScript 中的变量时,它们会“丢失”。
问题是:将字符串数组返回给 JavaScript 变量的正确方法是什么?
解决方案
如果我没记错的话,你需要把 SAFEARRAY
在一个 VARIANT
为了让它通过,然后使用 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();
其他提示
肖格9是正确的。COM 脚本要求所有输出都是 VARIANTS。
事实上,它还要求所有 输入 也可以是变体——在您最喜欢的帮助文件中查看 IDispatch 的令人讨厌的细节。只是认为 ATL 和类似层(很可能就是您正在使用的层)实现的双接口的魔力使您不必担心这一点。在调用实际方法之前,调用代码传递的输入 VARIANT 将被转换以匹配您的方法签名。
不隶属于 StackOverflow