Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

передача переменных в DLL - в чём я ошибаюсь?   Найти похожие ветки 

 
d_oleg ©   (2002-09-04 14:28) [0]

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


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

Uses Sharemem;


 
d_oleg ©   (2002-09-04 14:38) [2]

конечно есть


 
MBo ©   (2002-09-04 14:46) [3]

оно ?

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;

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


 
AFrolov ©   (2002-09-04 14:48) [4]

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


 
d_oleg ©   (2002-09-04 14:48) [5]

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


 
d_oleg ©   (2002-09-04 14:49) [6]

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


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

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


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

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


 
d_oleg ©   (2002-09-04 14:52) [9]

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


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

Используй TList


 
AFrolov ©   (2002-09-04 15:24) [11]

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


 
lenin ©   (2002-09-04 15:29) [12]

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


 
3JIA9I CyKA ©   (2002-09-04 15:36) [13]

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


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

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



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

Текущий архив: 2002.09.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
1-50853
Filat
2002-09-02 13:00
2002.09.16
Срочно!!! Delphi 6 и VG Library как подружить?


3-50586
Сергей Крылов
2002-08-23 11:14
2002.09.16
Имена пользователей базы данных!!!!


1-50701
BDRON
2002-09-05 08:03
2002.09.16
Сохранить большой объем текстовых данных в файл


1-50831
alexey-v
2002-09-03 09:05
2002.09.16
Обработчик события OnClick для массива CheckBox


1-50720
Micah'GF
2002-09-05 11:56
2002.09.16
Выключить монитор и блокировать клавиатуру.