Los Safearrays se crean con SafeArrayCreate
o SafeArrayCreateVector
, pero cuando pregunta acerca de iterar sobre un SAFEARRAY, digamos que ya tiene un SAFEARRAY devuelto por alguna otra función. Una forma es usar SafeArrayGetElement
API, que es especialmente conveniente si tiene SAFEARRAY multidimensionales, ya que permite, IMO, una especificación un poco más fácil de los índices.
Sin embargo, para los vectores (SAFEARRAY unidimensional) es más rápido acceder directamente a los datos e iterar sobre los valores. Aquí hay un ejemplo:
Digamos que es un SAFEARRAY de long
s, es decir. 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);
¿Qué es 'cmd'? ! –