Главная страница
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.49 MB
Время: 0.015 c
14-50972
Владимир Васильев
2002-08-22 11:40
2002.09.16
Есть кто из С. Посада?


3-50626
Ник
2002-08-26 17:38
2002.09.16
ftGraphic


1-50740
Borys
2002-09-02 19:07
2002.09.16
Видимость переменных


14-50911
michael_b
2002-08-20 21:51
2002.09.16
перебрасывания из *.pdf в *.doc


1-50769
maxim2
2002-09-06 09:17
2002.09.16
Как отключить правую кнопку мыши в элементе WebBrowser