【问题标题】:How do I put SAFEARRAY (array of bytes) to HTML Hidden field如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段
【发布时间】: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 我的意思是你自己的这个对象的版本。

标签: javascript c++ html com atl


【解决方案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_MarshalLPSAFEARRAY_Unmarshal(带有可选的 IDispatchIUnknown IID 来指定类型,但文档没有说明它是如何使用的)或 LPSAFEARRAY_UserMarshalLPSAFEARRAY_UserUnmarshal 将 SAFEARRAY 转换为序列化格式/从序列化格式转换。

    其次,处理数据传输。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2023-04-08
      • 2019-12-26
      相关资源
      最近更新 更多