将字节数组从JavaScript发送到COM的困境

时间:2010-03-14 08:57:26

标签: javascript asp.net c++ visual-c++ activex

我遇到了一些问题,因为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);

非常感谢任何帮助。提前谢谢!

2 个答案:

答案 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位字符)。