我在linux上使用专有库,在回调函数中使用SAFEARRAY类型:

HRESULT写(SAFEARRAY *数据)

SAFEARRAY在头文件中定义为typedef void SAFEARRAY.

我必须定义一个回调函数,它将获取数据(例如,作为* unsigned char)和它的长度(例如,作为int或size\_t)并在某处写入数据.


就像是:

HRESULT MyWrite(SAFEARRAY *Data) {
  unsigned char *data = SafeArrayGetData(Data);
  size_t length = SafeArrayGetLength(Data);
  write_data_somewhere(data, length);
}

然后将其与库一起使用:

ProprietaryLib::ExportThing(thing, MyWrite);

所以我的问题是:如何在linux上获取数据和它的长度,我没有oaidl.holeauto.h头文件.

解决方法:

关于此事的两点想法:

也许你已经看过了,但是Wine实现了SAFEARRAY.因此你可以看看
https://github.com/wine-mirror/wine/blob/master/dlls/oleaut32/safearray.c
https://github.com/wine-mirror/wine/blob/master/include/oaidl.idl
https://github.com/wine-mirror/wine/blob/master/include/oleauto.h
在我看来,要获得数组的长度和数据,只需访问结构的成员即可.例如,在safearray.c中,他们只是在不同的地方读取cbElements,而SafeArrayAccessData方法基本上只返回pvData. (另外,它“锁定”了数组.“锁定”似乎是一个参考计数器,当SAFEARRAY被调整大小或被释放时会被检查.)

你的MYSAFEARRAY(在评论中提到)不起作用的一个想法是
结构包装可能会干扰.在https://docs.microsoft.com/en-us/cpp/build/reference/zp-struct-member-alignment,他们说Windows SDK预先假定结构打包在8字节边界上.所以也许您可以输出原始字节并查看是否检测到模式.如果结果是问题,请尝试更改编译器设置.

标签: linux, safearray

相关文章推荐

添加新评论,含*的栏目为必填