Как вернуть локальный CComSafeArray в выходной параметр LPSAFEARRAY?

У меня есть функция COM, которая должна возвращать SafeArray черезLPSAFEARRAY* выходной параметр. Функция создает SafeArray с использованием ATLCComSafeArray шаблон класса. Моя наивная реализация используетCComSafeArray<T>::Detach() чтобы переместить владение из локальной переменной в выходной параметр:

void foo(LPSAFEARRAY* psa)
{
    CComSafeArray<VARIANT> ret;
    ret.Add(CComVariant(42));
    *psa = ret.Detach();
}

int main()
{
    CComSafeArray<VARIANT> sa;
    foo(sa.GetSafeArrayPtr());

    std::cout << sa[0].lVal << std::endl;
}

Проблема в том, чтоCComSafeArray::Detach() выполняетUnlock операция, так что, когда новый владелец SafeArray (основнойsa в этом случае) уничтожается, замок не равен нулю иDestroy не удается разблокировать SafeArray с помощьюE_UNEXPECTED (это приводит к утечке памяти, поскольку SafeArray не освобождается).

Как правильно передать право собственности между CComSafeArrays через границу метода COM?

Редактировать: Из одного ответа до сих пор кажется, что ошибка на стороне клиента (main) а не со стороны сервера (foo), но мне трудно поверить, чтоCComSafeArray не предназначен для этого тривиального варианта использования, должен быть элегантный способ получить SafeArray из COM-метода вCComSafeArray.

Ответы на вопрос(3)

Ваш ответ на вопрос