我正在使用Linux上的专有库,该库在回调函数中使用SAFEARRAY类型:
HRESULT Write(SAFEARRAY *Data)SAFEARRAY在头文件中定义为typedef void SAFEARRAY

我必须定义一个将获取数据(例如,作为*unsigned char)及其长度(例如,作为intsize_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上获取数据及其长度,在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字节边界上。因此,也许您可​​以输出原始字节并查看是否检测到模式。如果发现这是问题所在,请尝试更改编译器设置。
  • 关于c++ - Linux上的SAFEARRAY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54345277/

    10-10 21:24