Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Внизпередача переменных в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c