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

从JavaScript向COM发送字节数组的困境,javascript,asp.net,c++,visual-c++,activex,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,

我遇到了一点问题,因为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或变体接收,但我无法让它在我的一生中发挥作用

我试着调试并将ActiveX中接收到的内容视为SAFEARRAY或变体,但没有效果。以下是IDL部分:

[id(7), helpstring("blah blah blah")]  HRESULT  Blah( [in] VARIANT blah1, [out, retval]VARIANT* blah2);

非常感谢您的帮助。提前谢谢

JScript中的数组不是不同的类型,它们只是具有属性
length
并允许通过属性访问其内容的对象。
Invoke()
/
InvokeEx()
方法中,您收到的
VARIANT
参数应该包含一个
IDispatch
,它表示可编写脚本的对象。在该操作中,检索属性
length
,并通过属性名称
0
length-1
获取内容


作为一个实现示例,请参见FireBreats(
IDispatchAPI
在此处包装可编写脚本的浏览器对象)
dispApi->GetProperty(“length”)
将获得数组的大小,而
dispApi->GetProperty(“0”)
to
length-1
将获得数组的实际内容。

我5年前在一个项目中一直在努力解决这个问题。我们最终在JavaScript和COM之间交换字符串,因为它们的开销很低,并且可以很容易地交换。如果数据是真正的二进制数据,则必须对其进行编码。我们使用base64,但也可以将0x100添加到所有字节值中,因为字符串在任意一侧都是unicode(16位字符)

您的解决方案可以作为两个终端节点正确交换数据的概念证明,但它不是自动化方面的最佳解决方案。谢谢!是的,看起来IDispatch是一个不错的选择,因为我的Javascript代码确实创建了IDispatch类型的变体。谢谢你的提醒。@Georg:有什么样的样本可以让我从VARIANT中获取字节吗?@Jeeva:firestreats
VARIANT
conversion。将其与上面的
GetPropery()
实现结合起来应该可以让您继续。如果您可以从Javascript创建
Scripting.Dictionary
的实例并将值添加到其中,则
Items
属性将返回元素的
安全数组