[英]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.