Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
6-50886
Dmitry_Raduzhan
2002-07-10 08:33
2002.09.16
К знатокам WinSock


4-51018
hovl
2002-07-24 20:10
2002.09.16
Icons to exe-file


14-50953
Flash1
2002-08-21 21:51
2002.09.16
Методика оценки программного продукта?


3-50579
UnderSun
2002-08-22 22:58
2002.09.16
Помогите с примером реализации SQL сервера


3-50584
vita
2002-08-24 12:54
2002.09.16
работа с INTERBASE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский