У меня есть функция 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
?
Вы написали:
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, передача права собственности (»переместить семантику«) для этой оболочки. Тогда можно использовать методы оболочки для манипулирования массивом.
Кроме того, в коде качества продукции я бы не стал игнорировать ошибку HRESULT
s.
Других решений пока нет …