Как вернуть локальный 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
.