Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.015 c
8-50867
fore_3
2002-04-25 13:34
2002.09.16
Как сделать аквалайзер


4-51038
hovl
2002-07-26 20:30
2002.09.16
Резидент


7-50996
YDV
2002-06-19 11:42
2002.09.16
расшаривание COM портов в сети !...


4-51044
bytebutcher
2002-07-23 09:27
2002.09.16
APISpy (взаим. между DLL и программой)


1-50839
Filat
2002-09-04 11:39
2002.09.16
Как сделать вывод панели с ProgressBar.




   Наверх