通过CComPtr <idispatch> Invoke </idispatch>检索数组

时间:2013-04-08 07:32:41

标签: javascript c++ com atl

我正在使用CComPtr Invoke()从C ++调用Javascript函数。只要我从Javascript函数返回一个元素,我就可以使用ComVariant对象从C ++端提取它,其类型根据返回变量的数据类型进行设置。问题是,当我尝试从Javascript传输整个数组时,CComVariant对象类型设置为VT_DISPATCH,而不是VT_ARRAY。任何人都可以指导我如何检索数组元素?我会感恩的。

1 个答案:

答案 0 :(得分: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);
}