SafeArrayAccessData Function

Increments the lock count of an array, and retrieves a pointer to the array data.

HRESULT SafeArrayAccessData(  
  SAFEARRAY *  psa,       
  void HUGEP **  ppvData  
);

psa

Pointer to an array descriptor created by SafeArrayCreate.

ppvData

On exit, pointer to a pointer to the array data. Arrays may be larger than 64K, so very large pointers should be used only in Windows version 3.1 or later.

The return value obtained from the returned HRESULT is one of the following.

Return value

Meaning

S_OK

Success.

E_INVALIDARG

The argument psa was not a valid safe array descriptor.

E_UNEXPECTED

The array could not be locked.

After calling the SafeArrayAccessData function, you must call SafeArrayUnaccessData to unlock the array.

The following example sorts a safe array of one dimension that contains BSTRs by accessing the array elements directly. This approach is faster than using SafeArrayGetElement and SafeArrayPutElement.

long i, j, min; 
BSTR bstrTemp;
BSTR HUGEP *pbstr;
HRESULT hr;

// Get a pointer to the elements of the array.
hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
if (FAILED(hr))
goto error;

// Selection sort.
for (i = 0; i < psa->rgsabound.cElements-1; i++)
{
   min = i;
   for (j = i+1; j < psa->rgsabound.cElements; j++)
   {
      if (wcscmp(pbstr[j], pbstr[min]) < 0)
         min = j; 
   }

   // Swap array[min] and array[i].
   bstrTemp = pbstr[min];
   pbstr[min] = pbstr[i];
   pbstr[i] = bstrTemp;

}

SafeArrayUnaccessData(psa);
Show:
© 2014 Microsoft