gpt4 book ai didi

c++ - 如何遍历 SAFEARRAY **

转载 作者:可可西里 更新时间:2023-11-01 15:38:17 27 4
gpt4 key购买 nike

如何通过 C++ safearray 指针迭代指针并访问其元素。

我尝试复制 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);

有什么想法吗?

提前致谢

最佳答案

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

但是,对于 vector (一维 SAFEARRAY),直接访问数据并迭代值会更快。这是一个例子:

假设它是 long 的 SAFEARRAY,即。 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);

关于c++ - 如何遍历 SAFEARRAY **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com