SafeArrayGetElement 函数 (oleauto.h)

检索数组的单个元素。

语法

HRESULT SafeArrayGetElement(
  [in]  SAFEARRAY *psa,
  [in]  LONG      *rgIndices,
  [out] void      *pv
);

参数

[in] psa

SafeArrayCreate 创建的数组描述符。

[in] rgIndices

数组每个维度的索引向量。 最右侧 (最小有效) 维度为 rgIndices[0]。 最左侧的维度存储在 rgIndices[psa->cDims – 1]

[out] pv

数组的 元素。

返回值

此函数可以返回其中一个值。

返回代码 说明
S_OK
成功。
DISP_E_BADINDEX
指定的索引无效。
E_INVALIDARG
其中一个参数无效。
E_OUTOFMEMORY
无法为 元素分配内存。

注解

此函数在检索元素之前和之后自动调用 SafeArrayLockSafeArrayUnlock 。 调用方必须提供大小正确的存储区域才能接收数据。 如果数据元素是字符串、对象或变量,则函数会以正确的方式复制该元素。

示例

以下示例取自 COM 基础知识 SPoly 示例 (Cenumpt.cpp) 。

STDMETHODIMP CEnumPoint::Next(
   ULONG celt,
   VARIANT  rgvar[],
   ULONG * pceltFetched)
{
   unsigned int i;
   long ix;
   HRESULT hresult;

   for(i = 0; i < celt; ++i)
      VariantInit(&rgvar[i]);

   for(i = 0; i < celt; ++i){
      // Are we at the last element?
      if(m_iCurrent == m_celts){
      hresult = S_FALSE;
         goto LDone;
   }

      ix = m_iCurrent++;
      // m_psa is a global variable that holds the safe array.
      hresult = SafeArrayGetElement(m_psa, &ix, &rgvar[i]);
      if(FAILED(hresult))
         goto LError0;
   }
   hresult = NOERROR;

LDone:;
   if (pceltFetched != NULL)
      *pceltFetched = i;

   return hresult;

LError0:;
   for(i = 0; i < celt; ++i)
      VariantClear(&rgvar[i]);
   return hresult;
}

要求

要求
目标平台 Windows
标头 oleauto.h
Library OleAut32.lib
DLL OleAut32.dll