我正在linux上使用专有库,该库在回调函数中使用SAFEARRAY
类型:
HRESULT Write(SAFEARRAY *Data)
SAFEARRAY
在头文件中定义为typedef void SAFEARRAY
。
我必须定义一个回调函数,该函数将获取数据(例如,以*unsigned char
的形式和长度(例如,以int
或size_t
的形式)并将数据写入某个地方。 / p>
类似的东西:
HRESULT MyWrite(SAFEARRAY *Data) {
unsigned char *data = SafeArrayGetData(Data);
size_t length = SafeArrayGetLength(Data);
write_data_somewhere(data, length);
}
然后将其与库一起使用:
ProprietaryLib::ExportThing(thing, MyWrite);
答案 0 :(得分:0)
对此事有两种想法:
也许您已经看过它,但是Wine实现了SAFEARRAY
。因此,您可以看看
在我看来,要获取数组的长度和数据,只需访问结构的成员就可以了。例如,在safearray.c
中,他们只是在各个位置读取cbElements
,而方法SafeArrayAccessData
基本上只返回{{1}}。 (此外,它“锁定”了数组。“锁定”似乎是在调整SAFEARRAY的大小或释放它们时检查的参考计数器。)
为什么您的pvData
(在评论中提到)不起作用的一个想法是
结构打包可能会干扰。他们在https://docs.microsoft.com/en-us/cpp/build/reference/zp-struct-member-alignment中说Windows SDK假定结构以8字节边界打包。因此,也许您可以输出原始字节并查看是否检测到模式。如果确实是问题所在,请尝试更改编译器设置。