我正在使用Linux上的专有库,该库在回调函数中使用SAFEARRAY
类型:HRESULT Write(SAFEARRAY *Data)
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上获取数据及其长度,在Linux上我没有oaidl.h或oleauto.h头文件。
最佳答案
关于此事的两种想法:
SAFEARRAY
。因此,您可以看看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/