【问题标题】:SAFEARRAY on linuxLinux 上的 SAFEARRAY
【发布时间】:2019-06-18 02:35:21
【问题描述】:

我在 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);

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

【问题讨论】:

  • SAFEARRAY Data 我很确定命名参数可能不是无效的。
  • 对不起,我忘了 *
  • C++ 数组不会在任何地方存储长度。没有办法得到任意数组的长度。
  • 我无法通过库获取数据的长度。 SAFEARRAY 是微软的东西,他们没有提供在库的 linux 端口中使用它的方法。
  • 库应该为您提供从 SAFEARRAY 或带有结构定义的标题中提取所需数据的功能。他们提供示例代码吗? SAFEARRAY 是丑陋的野兽msdn.microsoft.com/en-us/magazine/…

标签: c++ linux safearray


【解决方案1】:

关于这个问题的两个想法:

【讨论】:

  • 我见过 Wine SAFEARRAY 的实现,但如果没有正确的结构,它将无法工作。 pvData 指向未分配的内存,cbElements 始终为 0。还尝试将字节写入二进制文件,然后使用十六进制编辑器对其进行检查,但很难找到模式。现在我正在尝试 gcc 的-fpack-struct=8__attribute__((aligned(8)),但没有成功。同样有趣的是,第一个字节是指向某个地方的指针。当我执行struct S { void *p} *x =(struct S)Data 时,我可以读取*x->p 中的值。
猜你喜欢
  • 2012-08-03
  • 2019-06-28
  • 2016-02-24
  • 1970-01-01
  • 2014-05-14
  • 2018-04-27
  • 2013-06-22
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多