从JavaScript向COM发送字节数组的困境
我遇到了一点问题,因为Javascript和ActiveX(用C++编写)的表现都不像小孩子。我要他们做的就是让Javascript发送字节数组,让ActiveX正确接收字节数组,以便进行更多的计算 这就是我在JS中声明字节数组的方式,我在JS中验证了它:从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,
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”)
tolength-1
将获得数组的实际内容。我5年前在一个项目中一直在努力解决这个问题。我们最终在JavaScript和COM之间交换字符串,因为它们的开销很低,并且可以很容易地交换。如果数据是真正的二进制数据,则必须对其进行编码。我们使用base64,但也可以将0x100添加到所有字节值中,因为字符串在任意一侧都是unicode(16位字符) 您的解决方案可以作为两个终端节点正确交换数据的概念证明,但它不是自动化方面的最佳解决方案。谢谢!是的,看起来IDispatch是一个不错的选择,因为我的Javascript代码确实创建了IDispatch类型的变体。谢谢你的提醒。@Georg:有什么样的样本可以让我从VARIANT中获取字节吗?@Jeeva:firestreatsVARIANT
conversion。将其与上面的GetPropery()
实现结合起来应该可以让您继续。如果您可以从Javascript创建Scripting.Dictionary
的实例并将值添加到其中,则Items
属性将返回元素的安全数组
。