如何将 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;

javascript

  $("#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(带有可选的 IDispatchIUnknown IID 来指定类型,但文档没有说明它是如何使用的)或 LPSAFEARRAY_UserMarshal 和LPSAFEARRAY_UserUnmarshal 将 SAFEARRAY 转换为序列化格式/从序列化格式转换。

其次,处理数据传输。

选项 1:将序列化数据保存在服务器端,并将代表已保存文件的令牌放入隐藏字段。 选项 2:使用 Hex、Base64 等将数据编码为可打印格式并将该数据放入隐藏字段。

无论哪种方式,当您需要取回数据时,只需使用匹配函数对其进行反序列化即可。

【讨论】:

以上是关于如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段的主要内容,如果未能解决你的问题,请参考以下文章

C# 中如何使用 safearray 安全数组

将字节数组放入 JSON,反之亦然

无法将 ByRef VARIANT 数组转换为 SAFEARRAY

使用 ATL/COM 将托管字节 [] 转换为非托管字节数组

C ++将文件的所有字节放入char数组中?

如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#