通过 CComPtr<IDispatch> Invoke 检索数组

Posted

技术标签:

【中文标题】通过 CComPtr<IDispatch> Invoke 检索数组【英文标题】:Retrieving an array through CComPtr<IDispatch> Invoke 【发布时间】:2013-03-30 05:07:08 【问题描述】:

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

【问题讨论】:

How can I convert a JavaScript array() to an ATL/COM array? 的可能重复项 你是对的。抱歉,我错过了那个。 对不起,我可以知道从 Javascript 函数返回单个元素的详细信息吗?感谢您的任何提示 【参考方案1】:

应该这样做:

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);

【讨论】:

@AlexeySubbota - 什么不起作用?提供更多信息或发布另一个问题。 显然是您的解决方案。数组没有 DISPID_NEWENUM @AlexeySubbota - 如果我发布了它,它对我有用。用复制代码发布另一个问题

以上是关于通过 CComPtr<IDispatch> Invoke 检索数组的主要内容,如果未能解决你的问题,请参考以下文章

获取 CComPtr 参数

错误 C2664:无法将参数 2 从 'const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *' 转换为 'ATL::CAdapt&l

COM 对象清理

COM技术入门

COM 互操作 (CCW) 中的重载 - IDispatch 名称包括后缀(_2、_3 等)

如何在没有 IDispatch 的情况下创建 VB.NET COM 可见接口?