Safearrays được tạo với SafeArrayCreate
hoặc SafeArrayCreateVector
, nhưng khi bạn hỏi về lặp qua SAFEARRAY, giả sử bạn đã có SAFEARRAY được trả về bởi một số hàm khác. Một cách là sử dụng API SafeArrayGetElement
đặc biệt thuận tiện nếu bạn có SAFEARRAY nhiều chiều, vì nó cho phép, IMO, dễ dàng xác định các chỉ số một chút.
Tuy nhiên, đối với vectơ (SAFEARRAY một chiều), việc truy cập dữ liệu trực tiếp và lặp qua các giá trị sẽ nhanh hơn. Dưới đây là ví dụ:
Giả sử đó là SAFEARRAY của long
s, tức là. 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);
Nguồn
2012-09-18 20:12:23
'cmd' là gì? ! –