如何循环访问安全阵列**
How to iterate through SAFEARRAY **
如何遍历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);
有什么想法吗?
提前致谢
安全数组是用 SafeArrayCreate
或 SafeArrayCreateVector
创建的,但是当您询问迭代 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 编程。
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- C++ Python 的扩展 - 安全内存访问和内存布局
- 如何进行线程安全shared_ptr修改和访问?
- 将积分类型的数组作为另一个不相关的积分类型的阵列进行访问的安全且符合标准的方法
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 是否可以访问非线程安全容器内指针指向的值(线程安全映射中的条目)?
- 在 OpenCV 中访问具有多个线程的 Mat 是否线程安全?
- C++:一个写入器/多个读取器访问一个unordered_map线程安全
- 是否访问指针元组和互斥锁线程安全
- 调用不访问已删除对象中的任何类成员的类方法是否安全
- 静态指针指向会员数组的安全操作员[]访问
- 如果迭代器的迭代器永远不会无效,则是STD :: MAP访问线程安全
- 访问"std::variant"的不安全、"noexcept"和无开销方式
- 使用原子指令确保映射访问安全,是否可以使用两个不同的原子对指令进行重新排序
- 如何从C或C 语言级别安全访问内存映射的硬件寄存器
- 如果"somethings"不需要访问"this",那么在"delete this"后做某事是否安全?
- 在循环的停止条件下访问阵列值是安全的吗?
- C++ stl unordered_map,线程安全,其中每个线程仅访问其自己分配的键,并且可以编辑该值
- 如何循环访问安全阵列**