たSafeArraysはSafeArrayCreate
またはSafeArrayCreateVector
で作成されていますが、SAFEARRAYを反復処理について尋ねると、あなたはすでにいくつかの他の関数によって返されたSAFEARRAYを持っているとしましょうされています。 1つの方法は、SafeArrayGetElement
APIを使用することです。これは多次元SAFEARRAYがある場合に特に便利です。IMOでは、インデックスの指定が少し簡単です。
しかし、ベクトル(一次元のSAFEARRAY)では、データに直接アクセスして値を反復する方が高速です。ここでは例です:
だが、それはlong
秒、すなわちのSAFEARRAYだとしましょう。 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);
'cmd'は何ですか? ! –