Это использование CComSafeArray плохо?

У меня есть функция COM:

GetData(SAFEARRAY ** pRetVal)

и следующий унаследованный код:

CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&saDataArray.m_psa);
SafeArrayLock(saDataArray);

Я сомневаюсь, что это хорошо, чтобы вручную управлять замками. Будет ли этот код сбой, когда m_psa был возвращен как NULL от GetData?

Как насчет следующего кода? Это лучше?

LPSAFEARRAY psa;
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&psa);
saDataArray.Attach(psa);

РЕДАКТИРОВАТЬ:
Я проверил оба кода выше. Есть одно отличие. Если GetData возвращается NULLнапрямую Attach это без NULL проверка вызовет исключение. И первая версия вернет E_INVALIDARG, Мой вопрос все еще остается, вы предпочитаете более позднюю версию, так как она использует объект SafeArray для поддержания подсчета, а не смешивания?

EDIT2:
Если по какой-либо причине я выберу первую версию, можно ли игнорировать E_INVALIDARG возвращаемое значение? Будет ли это иметь какой-либо побочный эффект, когда какой-то код позже будет использовать это saDataArray?

1

Решение

Вы написали:

SafeArray * psa;
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&psa);
saDataArray.Attach(psa);

Но я думаю, что реальный код должен быть:

LPSAFEARRAY psa; // not "SafeArray *"hr = pmyInterface->GetData(&psa);
CComSafeArray<double> saDataArray;
saDataArray.Attach(psa);

Увидеть этот вопрос для дальнейших деталей.

РЕДАКТИРОВАТЬ: Обновление ответа на основе ваших вопросов редактирования.

Мне действительно не нравится ваш первый код:

CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&saDataArray.m_psa);
SafeArrayLock(saDataArray); // <--- Explicit lock on a CComSafeArray-wrapped array

На самом деле, когда-то сырье SAFEARRAY предоставляется оболочке RAII C ++ (CComSafeArray), с этого момента я буду использовать только эту оболочку и ее методы для манипулирования массивом.
Если вы хотите сделать «ручную» обработку массива, просто .Detach() это из оболочки C ++ и использовать вызовы функций Win32 API. Но смешивание обоих кодов не является хорошим качеством, IMO.

Обратите внимание, что второй подход отличается, так как вы сначала используете SAFEARRAY, сделать GetData() метод заполните его, и тогда вы .Attach() это к CComSafeArray Оболочка C ++ RAII, передача права собственностипереместить семантику«) для этой оболочки. Тогда можно использовать методы оболочки для манипулирования массивом.

Кроме того, в коде качества продукции я бы не стал игнорировать ошибку HRESULTs.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]