powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Структуры для DLL
8 сообщений из 8, страница 1 из 1
Структуры для DLL
    #40014988
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Хотел уточнить некоторые детали по поводу передачи пользовательских типов в dll-файлы , Написанные на другом языке программирования. Сам DLL файл я делаю в Delphi, а передаю ему пользовательский тип, (или структуру) из VBA.
Выглядить тип так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Type MyType1
  Width_ As Double
  Height_ As Double
  Demand As Integer
End Type
...
Dim MyVar(10) as MyType1
...


Правильно ли я делаю, что для пользовательских типов нужно создавать в dll-файле аналогичную структуру? В Delphi это выглядит
так:
Код: pascal
1.
2.
3.
4.
5.
6.
  MyType=record
                 Width:Double;
                 Heigh:Double;
                 Demand:Integer;
               end; 
  ArrayOfMyType=array of MyType;


Record это аналог Type в VBA. В принципе срабатывает , поля заполняются. Т.е если бы это был бы язык C или Java нужно было также создавать ? И второй вопрос касается вещественных чисел. Вроде и там и там совпадают по размеру, 8 байт, но возвращает совсем не те числа. Я их заменял на Integer нормально все работает, правда и числа делал для проверки целые. Т.е. как нужно здесь работать с вещественными числами при передаче в dll?
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015293
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

надо проверить, правильно ли вы декларируете в VBA функцию, параметры должны быть с модификатором ByVal а также на стороне делфи функция для экспорта должна поддерживать соглашение StdCall, именно его поддерживает VB. В противном случае, вроде как по-умолчанию используется FastCall, и могут быть проблемы с вызовом. Типы могут совпадать по размеру байт, но разные соглашения хранения его в памяти. По идее и там и там стандарт IEEE какой-то по дробным числам, на вскидку не помню. Логически Type и Record нужны для одного и того же, но фактически в памяти могут быть различными. Раз вы структуру целых чисел получаете и нет проблем, значит корректно экспортируется структура
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015294
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передача массивов может плохо отработать, по хорошему вы передаёте адрес на нулевой элемент, и количество элементов. На принимающей стороне собираете низкоуровнево. Но возможно есть какой-то умный маршалинг у делфи, который соберёт корректно массив VB
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015301
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD
Передача массивов может плохо отработать, по хорошему вы передаёте адрес на нулевой элемент, и количество элементов. На принимающей стороне собираете низкоуровнево. Но возможно есть какой-то умный маршалинг у делфи, который соберёт корректно массив VB

Да, кстати , по передаче массивов проблем не возникало. Но сам массив не через ByVal передавал. А передавал вот так:
Код: vbnet
1.
2.
3.
4.
5.
Declare Sub MySub Lib...(x as MyType)
'Передается ссылка на нулевой элемент
Dim MyVar(10) As MyType
MySub MyVar(0)
...


Обычно так в API передают, судя по различным документациям. В Дельфи указываю stdcall. Мне больше кажется что нужно как то типы данных вещественных чисел совместить. Запасной выход я такой придумал: В Дельфи конвертировать вещественные числа в строку, и и потом брать ASCII код каждой цифры и точки/запятой в зависимости от формата, и запсывать в байтовый массив, который передается через VBA. В VBA байтовый массив восстанавливается снова в строку и через функцию Val преобразуется в вещественное число.
Долгий путь конечно, но это на самый крайний случай.
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015413
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

Если соберёте тестовую DLL, с функцией которая вернет просто число 1.2345. То я или кто-то другой попробует верно состыковать. Тут методом проб и ошибок надо попробовать. Лучше несколько функций соберите и возвращающих одно значение и возвращаюших в параметрах структуру
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015509
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребяты, а это ничего, что в VBA Integer - 2 байта, а в Delphi - "сколько получится в реализации",
и обычно там получается 4?
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015531
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD
Damir_85,

Если соберёте тестовую DLL, с функцией которая вернет просто число 1.2345. То я или кто-то другой попробует верно состыковать. Тут методом проб и ошибок надо попробовать. Лучше несколько функций соберите и возвращающих одно значение и возвращаюших в параметрах структуру

Да я попробую с разными типами данных вещественных чисел поработать. Может что то получится.
...
Рейтинг: 0 / 0
Структуры для DLL
    #40015533
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
ребяты, а это ничего, что в VBA Integer - 2 байта, а в Delphi - "сколько получится в реализации",
и обычно там получается 4?

я в этом случае в VBA Long использую.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Структуры для DLL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]