2012-09-18 9 views
10

come eseguire un'iterazione tramite il puntatore safearray C++ al puntatore e accedere ai relativi elementi.Come eseguire iterazione tramite SAFEARRAY **

ho cercato di replicare la soluzione postato da Lim Bio Liong http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 ma la cosa più strana è che il metodo firma IDL risulta essere

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

invece di

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

Tutte le idee ?

grazie in anticipo

+0

Che cos'è 'cmd'? ! –

risposta

21

I safearg sono creati con SafeArrayCreate o SafeArrayCreateVector, ma come chiedete di iterare su un SAFEARRAY, diciamo che avete già un SAFEARRAY restituito da qualche altra funzione. Un modo è utilizzare l'API SafeArrayGetElement che è particolarmente comoda se si dispone di SAFEARRAY multidimensionali, poiché consente, IMO, di specificare un po 'più facilmente gli indici.

Tuttavia, per i vettori (SAFEARRAY unidimensionale) è più rapido accedere ai dati direttamente e iterare sui valori. Ecco un esempio:

Diciamo che è un SAFEARRAY di long s, vale a dire. 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() non appartiene a questo codice. Non distruggere l'array se non lo possiedi. –

+0

il 'get from from somewhere' era inteso a denotare uno scenario tipico di avere un metodo che restituisce un SAFEARRAY come parametro' [out] 'nel qual caso il client è responsabile della pulizia, ma ciò potrebbe non essere ovvio. Ho modificato la risposta –

+0

Come accedere a Safearray quando ho 2 dimensioni? – savi

3

MSDN SafeArrayGetElement function ti dà un frammento di codice sull'uso SafeArrayGetElement per ottenere oggetto individuo a matrice.

SAFEARRAY structure e SafeArray* le funzioni spiegano l'API disponibile.

Nel progetto ATL/MFC si desidera utilizzare le classi wrapper ad es. CComSafeArray per semplificare e semplificare le cose. Vedi Simplifying SAFEARRAY programming with CComSafeArray su questo.

+0

Il tuo ultimo collegamento è rotto. –

+0

@SimonMourier: Grazie, ho sostituito con un link memorizzato nella cache, non sono sicuro che il contenuto originale non sia disponibile in modo permanente o temporaneo. –

+1

L'ho trovato qui se: https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray/ con google help –

Problemi correlati