|
Структуры для DLL
|
|||
---|---|---|---|
#18+
Здравствуйте. Хотел уточнить некоторые детали по поводу передачи пользовательских типов в dll-файлы , Написанные на другом языке программирования. Сам DLL файл я делаю в Delphi, а передаю ему пользовательский тип, (или структуру) из VBA. Выглядить тип так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Правильно ли я делаю, что для пользовательских типов нужно создавать в dll-файле аналогичную структуру? В Delphi это выглядит так: Код: pascal 1. 2. 3. 4. 5. 6.
Record это аналог Type в VBA. В принципе срабатывает , поля заполняются. Т.е если бы это был бы язык C или Java нужно было также создавать ? И второй вопрос касается вещественных чисел. Вроде и там и там совпадают по размеру, 8 байт, но возвращает совсем не те числа. Я их заменял на Integer нормально все работает, правда и числа делал для проверки целые. Т.е. как нужно здесь работать с вещественными числами при передаче в dll? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 18:18 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
Damir_85, надо проверить, правильно ли вы декларируете в VBA функцию, параметры должны быть с модификатором ByVal а также на стороне делфи функция для экспорта должна поддерживать соглашение StdCall, именно его поддерживает VB. В противном случае, вроде как по-умолчанию используется FastCall, и могут быть проблемы с вызовом. Типы могут совпадать по размеру байт, но разные соглашения хранения его в памяти. По идее и там и там стандарт IEEE какой-то по дробным числам, на вскидку не помню. Логически Type и Record нужны для одного и того же, но фактически в памяти могут быть различными. Раз вы структуру целых чисел получаете и нет проблем, значит корректно экспортируется структура ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 19:31 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
Передача массивов может плохо отработать, по хорошему вы передаёте адрес на нулевой элемент, и количество элементов. На принимающей стороне собираете низкоуровнево. Но возможно есть какой-то умный маршалинг у делфи, который соберёт корректно массив VB ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 19:36 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
VSVLAD Передача массивов может плохо отработать, по хорошему вы передаёте адрес на нулевой элемент, и количество элементов. На принимающей стороне собираете низкоуровнево. Но возможно есть какой-то умный маршалинг у делфи, который соберёт корректно массив VB Да, кстати , по передаче массивов проблем не возникало. Но сам массив не через ByVal передавал. А передавал вот так: Код: vbnet 1. 2. 3. 4. 5.
Обычно так в API передают, судя по различным документациям. В Дельфи указываю stdcall. Мне больше кажется что нужно как то типы данных вещественных чисел совместить. Запасной выход я такой придумал: В Дельфи конвертировать вещественные числа в строку, и и потом брать ASCII код каждой цифры и точки/запятой в зависимости от формата, и запсывать в байтовый массив, который передается через VBA. В VBA байтовый массив восстанавливается снова в строку и через функцию Val преобразуется в вещественное число. Долгий путь конечно, но это на самый крайний случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2020, 19:54 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
Damir_85, Если соберёте тестовую DLL, с функцией которая вернет просто число 1.2345. То я или кто-то другой попробует верно состыковать. Тут методом проб и ошибок надо попробовать. Лучше несколько функций соберите и возвращающих одно значение и возвращаюших в параметрах структуру ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 07:47 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
ребяты, а это ничего, что в VBA Integer - 2 байта, а в Delphi - "сколько получится в реализации", и обычно там получается 4? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 12:38 |
|
Структуры для DLL
|
|||
---|---|---|---|
#18+
VSVLAD Damir_85, Если соберёте тестовую DLL, с функцией которая вернет просто число 1.2345. То я или кто-то другой попробует верно состыковать. Тут методом проб и ошибок надо попробовать. Лучше несколько функций соберите и возвращающих одно значение и возвращаюших в параметрах структуру Да я попробую с разными типами данных вещественных чисел поработать. Может что то получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 13:20 |
|
|
start [/forum/topic.php?fid=60&fpage=3&tid=2154769]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 139ms |
0 / 0 |