2010-03-14 18 views
1

我遇到了一些問題,因爲Javascript和ActiveX(用C++編寫)都不像一個好孩子。我要求他們做的就是讓Javascript發送一個字節數組,並讓ActiveX正確接收字節數組,以便執行更多計算。從JavaScript發送字節數組到COM的困境

這是我宣佈我的字節數組在JS,我證實這裏面JS:

var arr = new Array(0x00, 0xA4, 0x04, 0x00, 0x10,0xA0, 0x00, 00, 00, 0x18, 0x30, 0x03, 0x01, 00, 00, 00, 00, 00, 00, 00, 00); 

的Javascript發送該數組作爲參數傳遞給一個ActiveX方法。這是棘手的部分;我想讓ActiveX方法接收字節數組作爲SAFEARRAY或VARIANT,但我無法讓它爲我的生活工作。

我試過調試,看到收到ActiveX內部的內容SAFEARRAY或VARIANT,但無濟於事。這裏是IDL分段:

[id(7), helpstring("blah blah blah")] HRESULT Blah([in] VARIANT blah1, [out, retval]VARIANT* blah2); 

任何幫助,非常感謝。提前致謝!

+0

如果您可以從Javascript創建一個'Scripting.Dictionary'實例,並將值添加到它,Item'屬性將返回元素的'SAFEARRAY'。 – 2018-02-13 05:33:50

回答

2

JScript中的數組沒有明顯的類型,它們只是具有屬性length並允許通過屬性訪問其內容的對象。
在您的Invoke()/InvokeEx()方法中,您收到的參數VARIANT應該包含代表可編寫腳本的對象的IDispatch。在此檢索屬性length並通過屬性名稱0length-1獲取內容。

作爲實現示例,參見例如, FireBreaths IDispatchAPI::GetProperty()IDispatchAPI包裝可編寫腳本的瀏覽器對象)。 dispApi->GetProperty("length")將獲得數組的大小,而dispApi->GetProperty("0")length-1將獲得數組的實際內容。

+0

是的,看起來像IDispatch是去看看我的Javascript代碼確實創建一個類型IDispatch的VARIANT的方式。感謝您的高舉。 – Orca 2010-03-14 11:30:27

+0

@Georg:有沒有我可以參考的任何樣本從VARIANT獲取字節? – Jeeva 2012-02-23 05:44:34

+1

@Jeeva:FireBreaths VARIANT轉換[在這裏](https://github.com/firebreath/FireBreath/blob/0b3514686466cc4279115baed375675429e0eb55/src/ActiveXCore/ActiveXBrowserHost.cpp#L181)。把它與上面的'GetPropery()'實現結合起來應該會讓你走。 – 2012-02-23 17:02:14

1

5年前,我一直在爲這個項目苦苦掙扎。我們最終交換了JavaScript和COM之間的字符串,因爲它們的開銷很低並且可以輕鬆交換。如果數據是真正的二進制數據,則必須對其進行編碼。我們使用了base64,但是你也可以把0x100加到所有的字節值上,因爲字符串在任何一邊都是unicode(16bit字符)。

+0

您的解決方案可以作爲兩個端節點正確交換數據的概念證明,但它不是自動化方面的最佳解決方案。非常感謝! – Orca 2010-03-14 11:29:47