SAFEARRAY на Linux - PullRequest
       36

SAFEARRAY на Linux

0 голосов
/ 24 января 2019

Я использую проприетарную библиотеку в 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, где у меня нет заголовочного файла oaidl.h или oleauto.h .

1 Ответ

0 голосов
/ 01 февраля 2019

Две мысли по этому поводу:

  • Возможно, вы уже видели это, но Wine реализует SAFEARRAY.Таким образом, вы можете взглянуть на

  • Мне кажется, что для получения длины и данных массива, было бы хорошо просто получить доступ к членам структуры.Например, в safearray.c они просто читают cbElements в разных местах, а метод SafeArrayAccessData в основном возвращает только pvData.(Кроме того, он «блокирует» массив. Кажется, что «блокировка» - это счетчик ссылок, который проверяется при изменении или освобождении SAFEARRAY.)

    Одна идея, почему ваш MYSAFEARRAY (упоминается в комментариях) не работает, это может мешать упаковке структуры.В https://docs.microsoft.com/en-us/cpp/build/reference/zp-struct-member-alignment говорится, что Windows SDK предполагает, что структуры упакованы по 8-байтовым границам.Поэтому, возможно, вы могли бы вывести необработанные байты и посмотреть, обнаружите ли вы шаблон.Если это окажется проблемой, попробуйте изменить настройки компилятора.

...