4

我正在尝试从 Visual C++ 中的 SAFEARRAY(作为函数的输出返回)中获取元素。

我以前从未使用过 SAFEARRAY,所以我不知道如何处理它。我应该将 SAFEARRAY 转换为长数组(如何?)还是可以简单地使用 SAFEARRAY 内的值的索引?

4

2 回答 2

6

您可能应该熟悉 MSDN 上的 SafeArray 文档。

您可能想要做的是调用SafeArrayAccessData()以获取指向安全数组内存缓冲区的指针,然后直接迭代这些值。这可能是访问这些值的最有效方式。下面的代码做了很多假设,您应该确保您理解这些假设(通过阅读安全数组文档)并且它们适用于您的特定情况......

void Func(SAFEARRAY *pData)
{
   void *pVoid = 0;

   HRESULT hr = ::SafeArrayAccessData(pData, &pVoid);

   MyErrorCheck::ThrowOnFailure(hr);

   const long *pLongs = reinterpret_cast<long *>(pVoid);

   for (int i = 0; i < pData->rgsabound[0].cElements; ++i)
   {
      const long val = pLongs[i];

      DoThingWithLong(val);          
   }

   hr = ::SafeArrayUnaccessData(pData);

   MyErrorCheck::ThrowOnFailure(hr);
}

请注意,上面的代码没有看到编译器......

于 2013-11-26T14:07:10.230 回答
2

SafeArrayGetElementSafeArrayAccessData。前者逐个检索元素。后者为您提供指向此SAFEARRAY实例包装的平面 C 样式数组的指针(完成后不要忘记SafeArrayUnaccesData)。

SafeArrayDestroy另请注意,一旦不再需要数组,您很可能负责销毁数组(使用)。

于 2013-11-26T14:01:15.487 回答