如何 return 来自 COM 模块中函数的字符串数组?

How to return an array of strings from a function in a COM module?

我的函数体如下

STDMETHODIMP CMyCustomAddin::getArray(SAFEARRAY** pArray)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    try {
        CComSafeArray<BSTR> sa(3);

        // 'v' is a std::vector<std::wstring>
        std::vector<std::string> v;
        v.push_back("string1"); v.push_back("string2"); v.push_back("string3");
        for (LONG i = 0; i < 3; i++)
        {
            CComBSTR bstr = ToBstr(v[i]);
            HRESULT hr = sa.SetAt(i, bstr.Detach(), FALSE);
            if (FAILED(hr))
            {
                AtlThrow(hr);
            }
        }

        *pArray= sa.Detach();
    }
    catch (const CAtlException& e)
    {
        AfxMessageBox(_T("Exception"));
    }
    return S_OK;
}

我从另一个 COM 模块调用这个函数为:

SAFEARRAY** arr;
pMyCUstomAddinObj->getArray(arr);

我在

收到访问冲突异常
*pArray= sa.Detach();

如何获取数组并遍历?

SAFEARRAY** arr;
pMyCUstomAddinObj->getArray(arr);

通过此初始化 pArray 指向垃圾,因此 *pArray = ... 是一个错误。也许你打算写:

SAFEARRAY* arr;
pMyCUstomAddinObj->getArray(&arr);