[英]Is this CComSafeArray usage bad?
我有一个COM功能:
GetData(SAFEARRAY ** pRetVal)
并遵循旧版代码:
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&saDataArray.m_psa);
SafeArrayLock(saDataArray);
我怀疑手动管理锁是否好。 GetData
将m_psa
作为NULL
返回时,该代码会崩溃吗?
下面的代码怎么样? 那个更好吗?
LPSAFEARRAY psa;
CComSafeArray<double> saDataArray;
hr = pmyInterface->GetData(&psa);
saDataArray.Attach(psa);
编辑:我测试了上面的两个代码。 有一个区别。 如果GetData
返回NULL
,则直接Attach
而不带NULL
检查将调用异常。 并且第一个版本将返回E_INVALIDARG
。 我的问题仍然存在,您是否喜欢更高版本,因为它使用SafeArray对象来保持计数而不是混合计数?
EDIT2:如果出于某种原因我选择了第一个版本,可以忽略E_INVALIDARG
返回值吗? 当某些代码以后使用此saDataArray
时,会产生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
提供给C ++ RAII包装器( CComSafeArray
), CComSafeArray
起,我将仅使用该包装器及其方法来操作该数组。
如果要对数组进行“手动”处理,只需从C ++包装器.Detach()
,然后使用Win32 API函数调用即可。 但是,将两者混在一起并不是高质量的代码,IMO。
请注意,第二种方法是不同的,因为首先使用原始的SAFEARRAY
,使GetData()
方法填充它,然后将其.Attach()
到CComSafeArray
C ++ RAII包装器, 将所有权转移 (“ 移动语义 ”)包装。 然后可以使用wrapper方法来操作数组。
另外,在生产质量代码中,我不会忽略错误HRESULT
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.