PDA

Visualizza la versione completa : [c++]SAFEARRAY


giuseppe500
22-09-2008, 13:06
Ciao.
Devo leggere dei SAFEARRAY da un server com.
prima di leggere i dati devo creare il safearray per la lettura,cosi:

m_pSAListNamesJoint = SafeArrayCreate(VT_VARIANT, 1, aDim);

volevo sapere cosa Ŕ meglio usare come tipo di elemento del SAFEARRAY sempre VARIANT?
O i tipi VT_BSTR ecc...?

Il problema Ŕ che ne nelle specifiche ne nella documentazione del server com c'Ŕ scritto che tipo usare.
Da un esempio in vba con i tipi String,Int ecc... usati come array.

XWolverineX
22-09-2008, 13:17
Dipende da cosa devi inserirci dentro!

giuseppe500
22-09-2008, 13:30
Devo leggere , il mio problema Ŕ che non so che tipo c'Ŕ nei safearray che mi arrivano dal com.
LEggendo il vba usa array di tipi string,int float ecc... ad es string(),int() ecc...

shodan
22-09-2008, 13:44
Se quello che viene inserito nel SAFEARRAY non ha un tipo fisso, ti conviene usare il VARIANT (ed eventualmente controllarlo con la classe _variant_t).

giuseppe500
22-09-2008, 14:55
grazie , un ultima cosa:
per calcolare il numero di elementi nell array faccio cosi' :



//creo il safearray
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound= 1;
aDim[0].cElements= 1;

SAFEARRAY* pSAOffsetI = SafeArrayCreate(VT_BSTR, 1, aDim);

.........................CARICO SAFEARRAY...................

//trovo quanti elementi ha:
long lstart, lend =0;
//inizio array elementi e fine array elementi
hr = SafeArrayGetLBound( pSAOffsetI , 1, &lstart );
hr = SafeArrayGetUBound( pSAOffsetI , 1, &lend );

//n of elementi
lElements =lend-lstart+1;


il problema Ŕ che quando faccio questo ciclo:



for(idx=0; idx < lElements - 1; idx++){
CString str = m_ComUtils->GetStringValueSA(sa,idx);
//per semplicitÓ metto gli elementi in un array
pArray->add(str);
}



mi salta un elemento!! :bh˛:

shodan
22-09-2008, 19:11
Originariamente inviato da giuseppe500
il problema Ŕ che quando faccio questo ciclo:



for(idx=0; idx < lElements - 1; idx++){
CString str = m_ComUtils->GetStringValueSA(sa,idx);
//per semplicitÓ metto gli elementi in un array
pArray->add(str);
}

mi salta un elemento!! :bh˛:

Semmai dovrebbe essere:


for(idx=lstart ; idx < lend + 1; idx++) { // oppure idx <= lend
CString str = m_ComUtils->GetStringValueSA(sa,idx);
//per semplicitÓ metto gli elementi in un array
pArray->add(str);
}

Dal momento che non stai usando un array C-like ma uno controllato dalla COM Automation non hai l'obbligo di partire da 0.

giuseppe500
23-09-2008, 10:33
solo che cosi' shodan se ho un array con 0 elementi
cosi' :
lstart =1 e lend=1 o
lstart =0 e lend=0

idx=0 ; idx < 0 + 1; idx++
o
idx=1 ; idx < 1 + 1; idx++

mi entra nel ciclo e non dovrebbe.

giuseppe500
23-09-2008, 13:28
scusa , ho capito

Loading