从SAFEARRAY获取元素(或将其转换为长数组)

mer*_*rch 4 c++ safearray visual-c++

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

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

Len*_*ate 5

您可能应该熟悉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);
}
Run Code Online (Sandbox Code Playgroud)

注意上面的代码还没有编译器...