如何循环访问安全阵列**

How to iterate through SAFEARRAY **

本文关键字:访问 安全 阵列 循环 何循环      更新时间:2023-10-16

如何遍历C++安全数组指针到指针并访问其元素。

我试图复制Lim Bio Liong发布的解决方案http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 但最奇怪的是,IDL 方法签名竟然是

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY ** test_struct_array);

而不是

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY(TestStruct)* test_struct_array);

有什么想法吗?

提前致谢

安全数组是用 SafeArrayCreateSafeArrayCreateVector 创建的,但是当您询问迭代 SAFEARRAY 时,假设您已经有一个由其他函数返回的 SAFEARRAY。一种方法是使用SafeArrayGetElement API,如果您有多维 SAFEARRAY,这特别方便,因为它允许 IMO 更容易指定索引。

但是,对于向量(单维 SAFEARRAY),直接访问数据并迭代值会更快。下面是一个示例:

假设它是long的安全阵列,即。VT_I4

// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory)
SAFEARRAY* saValues = ... 
LONG* pVals;
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
  long lowerBound, upperBound;  // get array bounds
  SafeArrayGetLBound(saValues, 1 , &lowerBound);
  SafeArrayGetUBound(saValues, 1, &upperBound);
  long cnt_elements = upperBound - lowerBound + 1; 
  for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
  {                              
    LONG lVal = pVals[i];   
    std::cout << "element " << i << ": value = " << lVal << std::endl;
  }       
  SafeArrayUnaccessData(saValues);
}
SafeArrayDestroy(saValues);

MSDN SafeArrayGetElement 函数为您提供了使用 SafeArrayGetElement 获取单个对象到数组的代码片段。

SAFEARRAY结构和SafeArray*函数解释了可用的 API。

在 ATL/MFC 项目中,您可能希望使用包装类,例如 CComSafeArray让事情变得更简单、更容易。请参阅使用 CComSafeArray 简化 SAFEARRAY 编程。

相关文章: