我遇到了一些问题,因为Javascript和ActiveX(用C ++编写)都不像好孩子。所有我要求他们做的是让Javascript发送一个字节数组,并让ActiveX正确接收字节数组,以便进行更多的计算。
这是我在JS中声明我的字节数组的方式,我在JS中验证了它:
var arr = new Array(0x00, 0xA4, 0x04, 0x00, 0x10,0xA0, 0x00, 00, 00, 0x18, 0x30, 0x03, 0x01, 00, 00, 00, 00, 00, 00, 00, 00);
Javascript将此数组作为参数发送到ActiveX方法。这是棘手的部分;我希望ActiveX方法接收字节数组作为SAFEARRAY或VARIANT,但我不能让它在我的生活中工作。
我尝试调试并将ActiveX内部收到的内容看作SAFEARRAY或VARIANT,但无济于事。以下是IDL细分:
[id(7), helpstring("blah blah blah")] HRESULT Blah( [in] VARIANT blah1, [out, retval]VARIANT* blah2);
非常感谢任何帮助。提前谢谢!
答案 0 :(得分:2)
JScript中的数组不是不同的类型,它们只是具有属性length
的对象,并允许通过属性访问其内容。
在Invoke()
/ InvokeEx()
方法中,您收到的VARIANT
参数应包含IDispatch
,表示可编写脚本的对象。在那里检索属性length
并通过属性名称0
获取内容到length-1
。
作为一个实现示例,请参阅例如FireBreaths IDispatchAPI::GetProperty()
(IDispatchAPI
将可编写脚本的浏览器对象包装在那里)。 dispApi->GetProperty("length")
会得到数组的大小,而dispApi->GetProperty("0")
到length-1
会获得数组的实际内容。
答案 1 :(得分:1)
5年前,我在一个项目中一直在努力解决这个问题。我们最终在JavaScript和COM之间交换字符串,因为它们的开销很低,可以轻松交换。如果数据是真正的二进制数据,则必须对其进行编码。我们使用了base64,但你也可以为所有字节值添加0x100,因为无论如何字符串都是unicode(16位字符)。