Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

передача переменных в DLL - в чём я ошибаюсь? [D6, Win2k]


d_oleg ©   (2002-09-04 14:28:00) 

Такая задача: есть в главном приложении динамический массив -
type
TArrStrings = array of TStrings;
этот массив надо передать в DLL. Причём передать хочется просто ссылку на массив, так чтобы DLL обращалась именно к той же переменной, таким образом при изменении массива в приложении в DLL эти изменения были бы тоже видимы.
Делаю так: в DLL создаю процедуру
procedure Request(AArray: Pointer); stdcall;
begin
DllArray := TArrStrings(AArray);
end;
при загрузке DLL вызываю эту процедуру и передаю ей массив. И получается, что в DLL передаётся массив по состаянию на момент передачи, изменения, происходящие с ним в головном приложении, остаются не видны. В чём ошибка, подскажите пожалуйста.


Старый Паскалист   (2002-09-04 15:43:00) [1]

Да, кстати:
Динамические массивы, в отличие от простых, при присваивании почленно НЕ копируются.
Они присваиваются именно как указатели.


3JIA9I CyKA   (2002-09-04 15:36:00) [2]

Правильно будет указотель 8)


lenin   (2002-09-04 15:29:00) [3]

я не знаю может это глупая идея, но что если сделать укозатель на укозатель.


AFrolov   (2002-09-04 15:24:00) [4]

или procedure Request( varAArray: Pointer); stdcall;меняй как тебе нравиться но за памятью придется самому следить.


Старый Паскалист   (2002-09-04 14:57:00) [5]

Используй TList


d_oleg   (2002-09-04 14:52:00) [6]

То есть при реаллокации массива изменяется адрес, по которому он лежит в памяти? Значит, по-любому придётся передавать в DLL заново :-(


Виктор Щербаков   (2002-09-04 14:50:00) [7]

Переменная типа TArrStrings в dll, которая по сути указатель, будет указавать на старую область памяти, а массив, после реаллокации, будет расположен совсем по другому адресу.


MBo   (2002-09-04 14:50:00) [8]

ты передал указатель. значение его в хосте изменилось, а в dll продолжается работа со старой копией, если я не ошибаюсь.
Кстати, array of TStrings - довольно экзотично


d_oleg   (2002-09-04 14:49:00) [9]

подозрение и у меня такое есть, вопрос в том, как реализовать без копии? Возможно ли?


AFrolov   (2002-09-04 14:48:00) [10]

Имеется подозрение, что DllArray := TArrStrings(AArray); создает копию этого массива внутри длл и работа идет именно с ней а не с переданным массивом.


d_oleg   (2002-09-04 14:48:00) [11]

не понял, к чему это? Ну да, изменили мы размерность массива, при этом переменная в DLL, которая по-идее должна указывать на сей массив, размерность не изменяет.


MBo   (2002-09-04 14:46:00) [12]

оно ?

procedure TForm1.Button1Click(Sender: TObject);
var a:array of integer;
begin
setlength(a,1);
label1.caption:=IntToHex(Cardinal(a),8);
setlength(a,500);
label2.caption:=IntToHex(Cardinal(a),8);
end;

реаллокация массива


d_oleg   (2002-09-04 14:38:00) [13]

конечно есть


Виктор Щербаков   (2002-09-04 14:33:00) [14]

Uses Sharemem;


Наверх

Титульная страница Поиск, карта сайта Написать письмо