簡體   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