2013-07-15 33 views
1

傳遞的JavaScript我發現在「wtypes.h」一些定義如何到c陣列從C++

VT_PTR = 26, 
VT_SAFEARRAY = 27, 
VT_CARRAY = 28, 
VT_USERDEFINED = 29, 
VT_LPSTR = 30, 
VT_LPWSTR = 31, 


* VT_PTR     [T]  pointer type 
* VT_SAFEARRAY   [T]  (use VT_ARRAY in VARIANT) 
* VT_CARRAY    [T]  C style array 
* VT_USERDEFINED   [T]  user defined type 
* VT_LPSTR    [T][P]  null terminated string 
* VT_LPWSTR    [T][P]  wide null terminated string 

在我看來,這個定義表明,一個變體可爲C陣列,PTR或c點。 但是當我使用如下代碼到C數組傳遞給JavaScript

STDMETHODIMP CFileSystemObject::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr){ 
    pVarResult->vt = VT_CARRAY|VT_I4; 
    pVarResult->pintVal = new int[4]; 
} 

如何到C數組從C傳遞到JavaScript不能獲得arg的類型++?

+0

可能的重複http://stackoverflow.com/questions/12005610/javascript-c-binding – suspectus

+0

@suspectus,我想我的問題有一些不同,從你的鏈接。 – tfzxyinhao

+0

你有什麼不同? – suspectus

回答

1

VT_CARRAY | VT_I4

已經沒有機會制定出明顯的原因:值28和3甚至不OR'rable。結果31的值不過是VT_LPWSTR ...將其與VT_ARRAY0x2000進行比較,該值位於不同的位位置,以不干擾基本類型。

VT_CARRAY是一個獨立的變體類型,我甚至不希望它在JS端支持。使用安全數組將數據傳遞給JS,這是一個可靠的替代選項。

2

有幾種方法可以達到您的目標。

一個)有你的方法返回一個SAFEARRAY(見SafeArrayCreateSafeArrayAccessData等)。然後,您可以將其打包成VT_ARRAY | VT_I4類型的變體。 JavaScript不能直接使用safearrays,但可以藉助VBArray對象。在JavaScript端,呼叫會是這個樣子:

var retArr = new VBArray(yourObject.yourMethod()).toArray() 

需要注意的是,如果你想你的方法可以被調用從VBScript除了JavaScript中,VBScript中既懂變種SAFEARRAYS(VT_ARRAY | VT_VARIANT),不是任何其他類型。所以你需要創建一個變體safearray,並讓每個變體包裝一個int。 JavaScript也可以與這樣的安排一起工作。

B)實現包裝數組的單獨COM集合對象。該對象將暴露,例如,lengthitem()屬性訪問個別元素;並可選擇使用VBScript的for each語法,如果這是一個問題,可以使用_NewEnum屬性。然後,您的方法將創建並返回該對象的一個​​實例。

我想,雖然我不是100%確定,即默認屬性(即一個DISPID_VALUEDISPID)通過objectName[i]語法在JavaScript訪問,除了常規的objectName.item(i)語法。如果這樣做,那會使集合對象看起來像一個本地JavaScript數組。

Ç)創建,填充並返回本地JavaScript Array對象:

http://www.codeproject.com/Articles/88753/Creating-JavaScript-arrays-and-other-objects-from

我不會親自推薦這個,因爲它緊密聯繫在一起的組件到一個特定的主機。我提到它的完整性。