Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Jim Jam
Зарегистрирован: 30.07.2008 Сообщения: 6
|
Добавлено: Пт Авг 01, 2008 8:46 pm Заголовок сообщения: Передача массива в DLL и обратно |
|
|
Может, кто-нибудь подскажет. Пишу ДЛЛ на Дельфи, в нее надо передать массив, допустим, целых чисел, обработать его и вернуть полученные данные. Если речь идет не о массиве - работает без проблем; с массивом - при вызове функции MapInfo вылетает с сообщением "Системная ошибка 10003".
Кто-нибудь сталкивался? В документации этот раздел освещен очень слабо :(
На Дельфи объявляю функцию примерно так:
function FunctionName (var ArrayName : array of integer) : integer; export; stdcall;
На MapBasic объявляю так:
Declare Function FunctionName Lib "DLLName.dll" (ArrayName() As integer) As integer |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пн Авг 04, 2008 7:34 pm Заголовок сообщения: |
|
|
Думаю, так не получится. Массив в Дельфи и массив в MapBasic - это разные типы данных с точки зрения их реализации. Самый простой и тупой подход - зашить массив в строку, типа:
1;2;4;5;76;7;8
передать в Дельфи и там разобрать. |
|
Вернуться к началу |
|
|
Jim Jam
Зарегистрирован: 30.07.2008 Сообщения: 6
|
Добавлено: Ср Авг 06, 2008 7:48 am Заголовок сообщения: |
|
|
Это, конечно, тоже вариант, но как в таком случае бороться с ограничением 255 символов?
Кстати, насчет различной реализации типов данных в Дельфи и МапБейсике - не факт. Я не уточнил, но в ДДЛ-ку массив передается корректно, с этим проблем нет. А вот обратно не вовращается :( Если бы различие было бы принципиальным, то и библиотека бы не работала, мне кажется |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Авг 06, 2008 10:21 am Заголовок сообщения: |
|
|
А где это ограничение в 255 символов? В Дельфи - там вообще хоть на 2Гб строку подай. А в MapBasic - ограничение 32767 символов. Не хватит?
По поводу реализации массивов - возможно есть общие принципы реализации, на смотреть области памяти под этими массивами. Это собственно и есть второй вариант, но уже посложнее. Получить из MapBasic массив, считать его указателем, и изучать память в окрестностях этого указателя, потом написать процедурку, которая будет уметь извлекать массив MapBasic из этого адреса памяти. |
|
Вернуться к началу |
|
|
Serj
Зарегистрирован: 25.08.2006 Сообщения: 50
|
Добавлено: Чт Авг 07, 2008 10:50 am Заголовок сообщения: |
|
|
См. документацию:
"MapBasic позволяет Вам передавать в качестве аргументов DLL процедур массивы так же, как
они передаются в sub процедуры MapBasic. Вы можете передавать массив в DLL, который
воспринимает массив как аргумент, задавая имя массива с пустыми круглыми скобками."
В сях я делал это без проблем, уверен, что и в дельфях это возможно... |
|
Вернуться к началу |
|
|
|