430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
|
|
1 | |
Получить указатель на данные, хранящиеся в SafeArray (не на сам SafeArray)29.07.2013, 12:30. Показов 3018. Ответов 7
Метки нет Все метки)
(
Есть некий SafeArray, о котором заранее известно, что это одномерный массив байт. То есть структура его проста и неизменна. Надеюсь, это облегчит следующую задачу: передать эти данные в программу, не понимающую SafeArray.
Насколько я знаю, SafeArray - это структура, в начале которой служебная информация (прежде всего длина), а затем собственно данные типа Variant. Таким образом, можно просто отсчитать какое-то количество байт от начала (т.е. пропустить заголовок, или как он там называется), а потом считывать каждый шестнадцатый байт. Ну или как-то так... Я понимаю, что это идеологически неверно, и надо использовать какой-нибудь SafeArrayAccessData. Но всё же, это реально? Или вообще бред? А как тогда поступить? Очень не хочется копировать из SafeArray в обычный массив байт.
0
|
29.07.2013, 12:30 | |
29.07.2013, 12:30 | |
Ответы с готовыми решениями:
7
Bad SAFEARRAY Transpose SafeArray Уничтожение SafeArray в Delphi XE |
Ушел с форума
![]() ![]() |
|
29.07.2013, 12:36 | 2 |
А почему бы не использовать SafeArrayLock ?
0
|
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
|
|
29.07.2013, 13:01 [ТС] | 3 |
Что-то я не уловил, как это может мне помочь. Наверное, я плохо объяснил. Есть DLL, написанная на C++. Она получает (из внешнего мира) некие данные в виде SafeArray. Я написал прогу (на экзотическом скриптовом языке), которая подключает эту DLL и получает указатель на SafeArray. Проверил - вроде всё работает. По крайней мере, когда данных нет, передаётся NULL, а когда есть - что-то другое. Надо полагать, адрес в памяти, где расположен SafeArray. Теперь я могу считывать данные оттуда, байт за байтом. А что толку? Интерпертировать эти данные моя программа не может, потому что не знакома с понятием SafeArray. По сути, мне надо написать враппер для SafeArray, но я не знаю, как.
0
|
Ушел с форума
![]() ![]() |
||||||
29.07.2013, 13:07 | 4 | |||||
Вот объявление SAFEARRAY (взято из MSDN):
По идее, Вам нужно в "экзотическом скриптовом языке", имея указатель на SAFEARRAY, добраться до этого поля. Но SafeArrayLock все равно придется вызвать, чтобы "запиннить" массив в памяти.
1
|
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
|
||||||
29.07.2013, 14:30 [ТС] | 5 | |||||
Проще это сделать ещё на стадии DLL. Вот так правильно?
0
|
Ушел с форума
![]() ![]() |
|
29.07.2013, 14:50 | 6 |
Нет. Выражение "array + 12" даст в итоге указатель, смещенный от array на
"sizeof (array) * 12" байт. Короче, будет указывать в пустоту. Правильнее так: "((BYTE *)array) + 12". Я не проверял, но кажется, без SafeArrayLock указатель на данные (pvData) будет нулевым. Во всяком случае, так подразумевается в соответствующем топике на MSDN.
1
|
Модератор
![]() 3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,426
|
|
29.07.2013, 17:09 | 7 |
функции SafeArrayGetLBound / SafeArrayGetUBound / SafeArrayGetElement вроде работают без блокировки - как вариант - можно перегнать данные в простой C-массив
1
|
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
|
|
29.07.2013, 17:55 [ТС] | 8 |
Я вообще ничего не собираюсь делать с этим массивом. Только передать указатель на него во внешнюю программу.
Что-то не срослось. А вот когда передал указатель в скрипт и обработал все эти смещения там - получилось. Почему эти два варианта неэквивалентны?
0
|
29.07.2013, 17:55 | |
29.07.2013, 17:55 | |
Помогаю со студенческими работами здесь
8
Как передать SAFEARRAY в C#? COM: SAFEARRAY добавление элементов Массив представить в виде SAFEARRAY Как сделать SafeArray (MFC)? Преобразование динамического байтового массива в SafeArray Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Контейнер std::map в C++
bytestream 09.02.2025
Контейнер std::map в C++ - один из наиболее мощных инструментов стандартной библиотеки, предназначенный для хранения пар ключ-значение. Каждый элемент в map состоит из уникального ключа и связанного. . .
|
Как в Python сделать вывод с print без перевода строки и пробела
hw_wired 09.02.2025
Функция print в Python обеспечивает гибкие возможности для вывода информации в консоль. При стандартном использовании эта функция автоматически добавляет символ перевода строки в конце выводимого. . .
|
Как в Python проверить, что у объекта есть атрибут
hw_wired 09.02.2025
В Python существует несколько встроенных способов проверки наличия атрибутов у объектов. Наиболее распространенным является использование функции hasattr(), которая позволяет безопасно определить. . .
|
Как удалить экспортированную переменную окружения в Linux
hw_wired 09.02.2025
В Linux работа с переменными окружения - важная часть системного администрирования и разработки. Экспортированные переменные окружения отличаются от обычных локальных переменных тем, что они доступны. . .
|
Ошибка Error: error:0308010C:digital envelope routines::unsupported
hw_wired 09.02.2025
Ошибка "error:0308010C:digital envelope routines::unsupported" чаще всего появляется при работе с Node. js приложениями и связана с изменениями в системе безопасности криптографических алгоритмов. . . .
|
В чем отличие между .prop() и .attr()
hw_wired 09.02.2025
В jQuery методы . prop() и . attr() часто вызывают путаницу, поскольку на первый взгляд предназначены для похожих целей. Однако между ними существуют принципиальные различия в работе с DOM-элементами и. . .
|
В чем отличие SCSS и SASS
hw_wired 09.02.2025
SCSS и SASS появились как решение проблем, связанных с ограничениями обычного CSS при разработке крупных веб-проектов. Традиционный CSS, несмотря на свою простоту, не предоставлял разработчикам. . .
|
Как найти дубликаты в таблице базы данных
hw_wired 09.02.2025
Дублирование записей в таблицах баз данных может возникать по разным причинам: ошибки при вводе данных, некорректная работа систем импорта, слияние данных из разных источников или неправильная. . .
|
Как удалить дубликаты из массива в JavaScript
hw_wired 09.02.2025
Самый простой и современный способ удаления дубликатов в JavaScript - использование структуры данных Set в сочетании с Array. from. Set автоматически хранит только уникальные значения, а Array. from. . .
|
Go Protobuf: новый Opaque API
hw_wired 09.02.2025
Protocol Buffers (protobuf) давно зарекомендовал себя как эффективный формат сериализации данных, широко используемый в микросервисных архитектурах и распределенных системах. Однако существующая. . .
|