| 1482 | |
| 1483 | |
| 1484 | HRESULT ComArrayEnum::Begin(ComObject *aArrayObject, ComArrayEnum *&aEnum, int aMode) |
| 1485 | { |
| 1486 | HRESULT hr; |
| 1487 | SAFEARRAY *psa = aArrayObject->mArray; |
| 1488 | void *arrayData; |
| 1489 | long lbound, ubound; |
| 1490 | |
| 1491 | if (SafeArrayGetDim(psa) != 1) |
| 1492 | return E_NOTIMPL; |
| 1493 | |
| 1494 | if ( SUCCEEDED(hr = SafeArrayGetLBound(psa, 1, &lbound)) |
| 1495 | && SUCCEEDED(hr = SafeArrayGetUBound(psa, 1, &ubound)) |
| 1496 | && SUCCEEDED(hr = SafeArrayAccessData(psa, &arrayData)) ) |
| 1497 | { |
| 1498 | VARTYPE arrayType = aArrayObject->mVarType & VT_TYPEMASK; |
| 1499 | UINT elemSize = SafeArrayGetElemsize(psa); |
| 1500 | if (aEnum = new ComArrayEnum(aArrayObject, arrayData, lbound, ubound, elemSize, arrayType, aMode >= 2)) |
| 1501 | { |
| 1502 | aArrayObject->AddRef(); // Keep obj alive until enumeration completes. |
| 1503 | } |
| 1504 | else |
| 1505 | { |
| 1506 | SafeArrayUnaccessData(psa); |
| 1507 | hr = E_OUTOFMEMORY; |
| 1508 | } |
| 1509 | } |
| 1510 | return hr; |
| 1511 | } |
| 1512 | |
| 1513 | ComArrayEnum::~ComArrayEnum() |
| 1514 | { |