如何将SAFEARRAY(字节数组)放入HTML隐藏字段

How do I put SAFEARRAY (array of bytes) to HTML Hidden field

本文关键字:放入 HTML 隐藏 字段 数组 字节数 SAFEARRAY 字节      更新时间:2023-09-26

我想从active-x组件中获取字节数组,将其存储在html表单输入隐藏字段中,然后通过表单提交将其传递给服务器。我该怎么做?

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);

浏览器告诉我:类型不匹配

虽然我不熟悉你的确切情况,但我以前见过一些类似的情况。

使用$('#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]);

我假设C++代码是服务器端代码。

处理此问题的最佳方法是将SAFEARRAY序列化。从那里你可以用两种方式来处理它。

首先,连载。我看过MSDN,我认为可以使用LPSAFEARRAY_Marshal和LPSAFEARARRAY_Unmarshal(使用可选的IDispatchIUnknownIID来指定类型,但文档中没有说明如何使用(或LPSAFEARAY_UserMarshal和LPSAFEARRAY_UserUnmarshall将SAFEARRAY转换为串行格式。

其次,处理数据传输。

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

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