Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Вниз

Дин. массивы и DLL   Найти похожие ветки 

 
Sandman25   (2003-11-13 18:24) [0]

Добрый день.

Посоветуйте, пожалуйста, способ передачи массива целых чисел из DLL.
Я пробовал передавать в DLL параметр, описанный как var ResArr: TArr; {TArr = array of integer}, но при вызове SetLength(ResArr, ..) внутри DLL происходит AV.
Поможет ли тут uses ShareMem или есть какой-то другой удобный способ передачи данных? Файлы, отображенные в память?


 
Sandman25   (2003-11-13 18:33) [1]

ShareMem не помог, все-таки массивы это не стринги...


 
MBo   (2003-11-13 18:42) [2]

Просто передавай указатель на массив (PArr=^TArr; TArr=array[0..0] of Integer; GetMem) и число элементов.


 
Sandman25   (2003-11-13 18:48) [3]

[2] MBo © (13.11.03 18:42)

Спасибо, попробую обязательно. Но уже завтра :(
Я тут поигрался еще немного и теперь функция возвращает TArr. Она вызывает Result.SetLength. Вроде бы работает, но я так понимаю, что нужно вызывать SetLength(..,0) для этого массива изнутри DLL. При выгрузке DLL массив ведь не освободится?


 
MBo   (2003-11-13 19:02) [4]

Sharemem поможет, если DLL будет использоваться только из Delphi.
Менеджер памяти при этом будет общим, так что изменять длину можно хоть в библ, хоть в осн. программе.
А вообще обычно надежнее передавать объекты, требующие инициализации, не как рез-т функции, а как var-параметр процедуры.


 
Владислав   (2003-11-13 19:54) [5]

Я бы посоветовал реализовать функцию (процедуру) в dll так.
Ей передается в качестве параметра указатель на буфер для приема массива. Если указатель на массив nil, то она просто возвращает длину массива. Если нет, то заполняет массив.
Смысл такой. Процедура принимает указатель на буффер массива и длину буфера. Если передать длину nil и размер 0, она вернет нужный размер. Если размер не ноль, заполняет буфер до значения параметра размер.
Вызывать просто передаем nil и размер 0. Она нам вернула реальный размер массива. Делаем SetLength для нашего массива. Размер мы уже получили. Вызываем еще раз. Теперь передаем указатель на первый элемент массива и его размер. Она заполняет его.
В самой dll-функции все просто. Если размер ноль, вернули реальный размер, если не ноль, делаем Move из массива в dll в массив в приложении и, опять же, возвращаем реальный размер. Количество указано во втором параметре.

Иначе sharemem.


 
Sandman25   (2003-11-14 10:40) [6]

Спасибо, MBo.
Сделал через GetMem и создание еще одной процедуры в DLL, которая вызывает FreeMem. С ShareMem никак работать не хотело, да и не хочется таскать с собой BORLNDMM.DLL. А при вызове FreeMem из хоста библиотека оставалась загруженной.

[5] Владислав © (13.11.03 19:54)

Спасибо за идею, но в данном случае она не очень подходит. Дело в том, что данные получаются от пользователя (выбор элементов из дерева), так что для того, чтобы узнать нужный размер, мне придется получить эти данные как обычно и где-то их сохранить для следующего вызова, когда будет передан правильный буфер. К тому же данная DLL будет использоваться не только мной, но и человеком, который только месяц изучает Delphi. Хочется сделать интерфейс к DLL попроще. 2 процедуры, из которых вторая вызывается всегда после первой, проще для использования неопытными программистами ИМХО.


 
Владислав   (2003-11-14 10:43) [7]

"Сделал через GetMem и создание еще одной процедуры в DLL, которая вызывает FreeMem"

Тоже хороший выход.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
3-78802
Denisiy
2003-11-05 12:02
2003.11.24
Теоретический вопрос: что лучше использовать?Query или StoredProc


1-79003
Aik
2003-11-14 10:05
2003.11.24
Ошибка при использовании Webbrowser


1-78947
Анна
2003-11-12 09:51
2003.11.24
Переместить папку


1-79024
Relaxxx
2003-11-13 16:29
2003.11.24
Ужас....кто знает как работать с TVirtualStrinGrid


4-79231
Ich Hasse
2003-09-27 18:55
2003.11.24
Ожидание завершения потока





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский