繁体   English   中英

这种CComSafeArray用法不好吗?

[英]Is this CComSafeArray usage bad?

我有一个COM功能:

GetData(SAFEARRAY ** pRetVal)

并遵循旧版代码:

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

我怀疑手动管理锁是否好。 GetDatam_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM