我需要调用Win32 API来获取一系列字符串,并且我想将这些字符串的数组返回给JavaScript。 这适用于在本地计算机上运行的脚本,而不是Web浏览器。
我的COM对象IDL文件具有我要调用的接口:
1
| HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); |
该函数正确返回,但是在将字符串分配给JavaScript中的变量时,字符串已"丢失"。
问题是:
将字符串数组返回给JavaScript变量的正确方法是什么?
------------------------
如果我没记错的话,您需要将SAFEARRAY包裹在VARIANT中才能通过,然后使用VBArray对象在JS方面解压缩它:
1 2 3 4 5 6 7 8 9 10
| HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
// ...
_variant_t ret;
ret.vt = VT_ARRAY|VT_VARIANT;
ret.parray = rgBstrStringArray;
*pvarBstrStringArray = ret.Detach();
return S_OK;
} |
然后
1
| var jsFriendlyStrings = new VBArray( axOb.GetArrayOfStrings() ).toArray(); |
刺9
是正确的。 COM脚本要求所有输出均为VARIANTS。
实际上,它还要求所有INPUT都同样是VARIANTS -请在您喜欢的帮助文件中查看IDispatch的详细信息。 只需考虑到ATL和类似层(很可能是您在使用的层)实现双接口的神奇之处,您就不必为此担心。 在调用实际方法之前,将调用代码传递的输入VARIANT转换为与您的方法签名匹配。