2011-07-05 72 views
0

我想從active-x組件獲取字節數組,將它存儲在html-form輸入隱藏字段中,然後通過form-提交。我怎樣才能做到這一點?我怎麼把SAFEARRAY(字節數組)到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); 

瀏覽器告訴我:類型不匹配

+0

我對ActivceX一無所知,但我會建議像'.toString()'這樣的數據。 –

+0

對不起,@James,toString()向我返回「Object Object」 –

+0

toString()返回「Object Object」,表示沒有以有意義的方式在對象上實現toString()。看到我的答案。 –

回答

1

雖然我不熟悉你的確切situat離子,我以前見過一些類似的情況。

你是正確的使用$('#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]); 
0

我假設的C++代碼是服務器端的代碼。

的最佳方式處理這是連載的SAFEARRAY。在那裏,您可以用兩種方式處理它。

首先,系列化。我已經看了MSDN,我想用LPSAFEARRAY_MarshalLPSAFEARRAY_Unmarshal(帶有可選IDispatchIUnknown IID來指定類型,但文檔沒有說明它是如何使用的)或LPSAFEARRAY_UserMarshalLPSAFEARRAY_UserUnmarshal將SAFEARRAY轉換爲序列化格式或從序列化格式轉換SAFEARRAY。

其次,處理數據傳輸。

  • 選項1:將序列化數據保存在服務器端,並將表示保存文件的標記放入隱藏字段中。
  • 選項2:使用十六進制,Base64等將數據編碼爲可打印格式並將數據放入隱藏字段。

無論哪種方式,當您需要獲取數據時,只需使用匹配函數對其進行反序列化即可。