2012-09-18 106 views
10

如何通過C++ safearray指針遍歷指針並訪問其元素。如何遍歷SAFEARRAY **

我試圖複製由林生物LIONG發佈 http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 的解決方案,但奇怪的是,該IDL方法簽名出來是

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY ** test_struct_array); 

,而不是

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY(TestStruct)* test_struct_array); 

任何想法?

由於事先

+0

什麼是'cmd'? ! – 2012-09-18 20:09:02

回答

21

安全陣列是用SafeArrayCreateSafeArrayCreateVector創建的,但是當您詢問關於SAFEARRAY的迭代時,假設您已經有一個SAFEARRAY由其他函數返回。一種方法是使用SafeArrayGetElement API,如果您擁有多維SAFEARRAY,則API特別方便,因爲它允許IMO更容易地指定索引。

但是,對於矢量(單維SAFEARRAY),直接訪問數據並迭代這些值會更快。下面是一個例子:

假設這是一個SAFEARRAY long s,即。 VT_I4

// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory) 
SAFEARRAY* saValues = ... 
LONG* pVals; 
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory 
if (SUCCEEDED(hr)) 
{ 
    long lowerBound, upperBound; // get array bounds 
    SafeArrayGetLBound(saValues, 1 , &lowerBound); 
    SafeArrayGetUBound(saValues, 1, &upperBound); 

    long cnt_elements = upperBound - lowerBound + 1; 
    for (int i = 0; i < cnt_elements; ++i) // iterate through returned values 
    {        
    LONG lVal = pVals[i]; 
    std::cout << "element " << i << ": value = " << lVal << std::endl; 
    }  
    SafeArrayUnaccessData(saValues); 
} 
SafeArrayDestroy(saValues); 
+5

SafeArrayDestroy()不屬於此代碼。如果您不擁有它,請不要銷燬該陣列。 –

+0

'從某個地方得到它們'意在表示一種典型的方法,即將一個SAFEARRAY作爲'[out]'參數返回,在這種情況下客戶端負責清理,但這可能並不明顯。我編輯了答案 –

+0

當我有2個維度時,如何訪問Safearray? – savi

3

SafeArrayGetElement function MSDN給你使用SafeArrayGetElement以獲得個體對象陣列的代碼段。

SAFEARRAY structureSafeArray*函數解釋了可用的API。

在ATL/MFC項目中,您希望使用包裝類,例如CComSafeArray使事情變得更簡單和容易。請參閱Simplifying SAFEARRAY programming with CComSafeArray

+0

您的最後一個鏈接已損壞。 –

+0

@SimonMourier:謝謝,我用一個緩存鏈接取代了,我不確定這些內容是否永久或暫時不可用。 –

+1

我在這裏找到它,如果:https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray/與谷歌幫助 –