在Linux上的SAFEARRAY

5

我正在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上,我没有oaidl.holeauto.h头文件,如何获取数据及其长度。

SAFEARRAY数据。我非常确定一个命名参数不能是void。 - eerorika
抱歉,我忘记了 *。 - microo8
1
C++ 数组不会在任何地方存储其长度。没有办法获取任意数组的长度。 - Barmar
1
我无法使用该库获取数据的长度。SAFEARRAY是微软的东西,他们没有提供在该库的Linux版本中使用它的方法。 - microo8
2
库应该为您提供从SAFEARRAY或结构定义头中提取所需数据的函数。它们是否提供示例代码?SAFEARRAY很难看 https://msdn.microsoft.com/en-us/magazine/mt778923.aspx?f=255&MSPPError=-2147217396 - Frane
显示剩余15条评论
1个回答

0

关于这个问题,我有两个想法:


我看过Wine的SAFEARRAY实现,但是如果没有正确的结构,它将无法工作。 pvData指向未分配的内存,而cbElements始终为0。我还尝试将字节写入二进制文件,然后使用十六进制编辑器进行检查,但很难找到模式。现在我正在尝试使用gcc的-fpack-struct = 8__attribute__((aligned(8)),但没有成功。另外有趣的是,前几个字节是指向某个地方的指针。当我执行struct S { void *p} *x =(struct S)Data时,我可以读取*x->p中的值。 - microo8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接