如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段
Posted
技术标签:
【中文标题】如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段【英文标题】:How do I put SAFEARRAY (array of bytes) to HTML Hidden field 【发布时间】:2011-09-28 13:28:12 【问题描述】:我想从 active-x 组件中获取字节数组,将其存储在 html-form 输入隐藏字段中,然后通过 form-submit 将其传递给服务器。我怎样才能做到这一点?
MIDL:
HRESULT Data([out, retval] SAFEARRAY(VARIANT) *pArray);
C++/ATL
STDMETHODIMP MyActiveX::get_Data(SAFEARRAY **pArray)
CComSafeArray<BYTE> arr;
for (int i = 0; i < 10; i++)
CComVariant a;
a = (BYTE)i;
arr.Add(a);
arr.CopyTo(pArray);
return S_OK;
$("#hiddenField").val(myActiveX.Data);
浏览器告诉我:类型不匹配
【问题讨论】:
我对 activceX 一无所知,但我建议在数据上使用.toString()
之类的东西。
对不起,@James,toString() 将“Object Object”返回给我
toString()
返回“Object Object”表示toString()
没有以有意义的方式在您的对象上实现。看我的回答。
在 Firefox 中使用 Firebug 来识别对象的类型及其拥有的成员。我猜它可能是一个整数数组。
@Andrew 我的意思是你自己的这个对象的版本。
【参考方案1】:
虽然我不熟悉你的具体情况,但我以前见过一些类似的情况。
使用$('#hiddenField')
将数据放入字段是正确的。如果您在该字段上添加了 name
属性,使其成为 HTTP 提交的一部分,那么该部分很好。
至于myActiveX.Data
,我想这是某种JavaScript 对象。请记住,只能将字符串放入 HTML 输入;它不保存二进制数据。
我要做的是在$("#hiddenField").val(myActiveX.Data);
之前放置一个断点。如果您不熟悉,请使用 debugger
关键字。在调试器中运行代码并查看myActiveX.Data
值的结构。它可能有某种包装字段。
或者,如果您无法访问良好的 JavaScript 调试器,请尝试以下操作“
for(x in myActiveX.Data)
alert(x + ": " + myActiveX.Data[x]);
【讨论】:
【参考方案2】:我假设 C++ 代码是服务器端代码。
处理此问题的最佳方法是序列化 SAFEARRAY。从那里您可以通过两种方式处理它。
首先,序列化。我查看了 MSDN,我认为使用 LPSAFEARRAY_Marshal 和 LPSAFEARRAY_Unmarshal(带有可选的 IDispatch
或 IUnknown
IID 来指定类型,但文档没有说明它是如何使用的)或 LPSAFEARRAY_UserMarshal 和LPSAFEARRAY_UserUnmarshal 将 SAFEARRAY 转换为序列化格式/从序列化格式转换。
其次,处理数据传输。
选项 1:将序列化数据保存在服务器端,并将代表已保存文件的令牌放入隐藏字段。 选项 2:使用 Hex、Base64 等将数据编码为可打印格式并将该数据放入隐藏字段。无论哪种方式,当您需要取回数据时,只需使用匹配函数对其进行反序列化即可。
【讨论】:
以上是关于如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段的主要内容,如果未能解决你的问题,请参考以下文章
无法将 ByRef VARIANT 数组转换为 SAFEARRAY