Как вернуть массив строк из функции в COM-модуль? - PullRequest
0 голосов
/ 24 января 2020

Мое тело функции выглядит следующим образом

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

Как получить массив и пройти по нему?

1 Ответ

0 голосов
/ 24 января 2020
SAFEARRAY** arr;
pMyCUstomAddinObj->getArray(arr);

При этой инициализации pArray указывает на мусор, поэтому *pArray = ... является ошибкой. Возможно, вы хотели написать:

SAFEARRAY* arr;
pMyCUstomAddinObj->getArray(&arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...