2013-04-08 19 views
0

我使用CComPtr Invoke()從C++調用Javascript函數。只要我從Javascript函數返回一個元素,就可以使用ComVariant對象從C++端提取它,其類型根據返回變量的數據類型設置。問題是,當我嘗試從Javascript傳輸整個數組時,CComVariant對象類型被設置爲VT_DISPATCH,而不是VT_ARRAY。任何人都可以請指導我如何檢索數組元素?我會很感激。通過CComPtr檢索數組<IDispatch>調用

+0

可能重複[?我如何轉換一個JavaScript陣列()到ATL/COM陣列(http://stackoverflow.com/questions/5014711/how-can-i-convert-a-javascript-array-to-at-atl-com-array) – user93353 2013-04-08 07:49:02

+0

你是對的。對不起,我錯過了那一個。 – Imran 2013-04-08 08:43:26

+0

對不起,我可以知道從Javascript函數返回單個元素的細節嗎?感謝任何提示 – 2015-03-20 08:16:17

回答

0

像這樣的東西應該這樣做:

HRESULT DoSomethingWithAJavaScriptArray(VARIANT v) 
{ 
    if (V_VT(&v) != VT_DISPATCH) 
     return E_UNEXPECTED; 

    _variant_t out; // need comutil.h 

    // get the enumeration method see [Reserved DISPIDs][1] 
    HRESULT hr = V_DISPATCH(&v)->Invoke(DISPID_NEWENUM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, NULL, &out, NULL, NULL); 
    if (FAILED(hr)) 
     return hr; 

    if (V_VT(&out) != VT_UNKNOWN) 
     return E_UNEXPECTED; 

    // get the IEnumVariant from the interface 
    CComPtr<IEnumVARIANT> pEnum; 
    hr = V_UNKNOWN(&out)->QueryInterface(IID_IEnumVARIANT, (void**)&pEnum); 
    if (FAILED(hr)) 
     return hr; 

    // do a foreach 
    ULONG fetched = 0; 
    do 
    { 
     _variant_t element; 
     hr = pEnum->Next(1, &element, &fetched); 
     if ((FAILED(hr)) || (fetched == 0)) 
      return S_OK; 

     // do something with the VARIANT here 
      ... 
    } 
    while(TRUE); 
} 
+0

這不起作用。我測試過了。 – 2017-12-08 08:50:49

+0

@AlexeySubbota - 什麼不行?提供更多信息或發佈其他問題。 – 2017-12-08 12:53:22

+0

顯然你的解決方案。數組沒有DISPID_NEWENUM – 2017-12-08 17:29:34