Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно передать из DLL? [D7, WinXP]


Игорь ©   (2009-09-23 12:51:00) 

Подскажите как правильно передать из DLL TMyRecord а в приложении принять?

type
 TSomeRecord = record
   Value: Cardinal;
 end;

 TSomeRecord2 = record
   Value: Cardinal;
   ArrayOfSomeRecord: Array of TSomeRecord;
 end;

 TMyRecord = Array of TSomeRecord2;


Sapersky   (2009-09-23 15:07:00) [1]

1) Указатель (PMyRecord) не нужен, можно использовать переменную с Var.
2) Если не используется ShareMem - освобождать память должен тот, кто её выделил (DLL, приложение).
3) С дин. массивом ShareMem необязателен - при условии (2) и если не копировать полученный массив (или ещё как-то дёргать счётчик ссылок) в основной программе. Т.е. получили данные - отобразили - вызвали ф-ю освобождения из DLL. Для новичка, наверное, проще использовать ShareMem, чем помнить о всех условиях, тем более если в перспективе будут использоваться строки (изменяющей счётчик "компиляторной магии" у строк гораздо больше).


Игорь   (2009-09-23 13:56:00) [2]

Пойду почитаю что нибудь в разделе для начинающих что бы не позориться...


Leonid Troyanovsky   (2009-09-23 13:56:00) [3]


> Игорь ©   (23.09.09 13:48) [12]

> Но я не передаю Strings ни параметрах

or dynamic arrays
Shared-memory manager, RTFM.

--
Regards, LVT.


Медвежонок Пятачок   (2009-09-23 13:50:00) [4]

в общем резюме такое:
всему коду сделать Ctrl+A + Shift Del


Медвежонок Пятачок   (2009-09-23 13:49:00) [5]

а вообще веселый код.
сначала делаем гетмем на сто байт, затем в длл вызываем финалайз (пачиму не фримем и зачем вообще гетмем вызвали)

:)


Игорь   (2009-09-23 13:48:00) [6]


> Игорь Шевченко ©   (23.09.09 13:28) [10]


Но я не передаю Strings ни параметрах, ни как результат


Сергей М.   (2009-09-23 13:33:00) [7]


> Игорь ©   (23.09.09 13:20) [8]


> stdcall


Ты же сказал

> Delphi -> Delphi


??

Тогда с какой луны свалилось stdcall?


Игорь Шевченко   (2009-09-23 13:28:00) [8]

Sharemem использовать, согласно комментарию ?


Медвежонок Пятачок   (2009-09-23 13:23:00) [9]

ужас какой.

и кто тебе сказал, что после гетмема поле динамического массива будет указывать на то что оно должно указывать?


Игорь   (2009-09-23 13:20:00) [10]

dll

type
TSomeRecord = record
  Value: Cardinal;
end;

TSomeRecord2 = record
  Value: Cardinal;
  ArrayOfSomeRecord: Array of TSomeRecord;
end;

TMyRecord = Array of TSomeRecord2;
PMyRecord = ^TMyRecord;

function SomeFunction(var MyRecord: PMyRecord): Integer; stdcall;
var
 i: Cardinal;
begin
 Finalize(MyRecord^);
 SetLength(MyRecord^, 24);
 for i:= 0 to 23 do
   SetLength(MyRecord^[i].ArrayOfSomeRecord, 4);

 MyRecord^[12].ArrayOfSomeRecord[4].Value:= 35356;
end;


приложение

var
 MyRecord: PMyRecord;
begin
 GetMem(MyRecord, 100);
 SomeFunction(MyRecord);
 Caption:= IntToStr(MyRecord^[12].ArrayOfSomeRecord[4].Value);
 FreeMem(MyRecord);
end;
CODE>


Медвежонок Пятачок   (2009-09-23 13:07:00) [11]

вопрос скорее всего задан в связи с тем, что неправильно распределны роли между хостом и длл в распределения памяти и в связи со временем жизни распределенной памяти.

то есть он уже что-то как-то передает, но в хост приложении получает кашу.


Сергей М.   (2009-09-23 13:03:00) [12]


> Игорь ©   (23.09.09 13:01) [4]


Тогда просто собери оба проекта с установленной опцией Build With Run-Time Packages. Больше никаких особенных телодвижений для достижения "правильности" не требуется.


Сергей М.   (2009-09-23 13:01:00) [13]


> структурка придумана явно в угаре


Ну это он, наверно, для примера)
Позже, видимо, планируется напихать туда полей всякоразных)


Игорь   (2009-09-23 13:01:00) [14]


> Сергей М. ©   (23.09.09 12:53) [1]


Delphi -> Delphi


Медвежонок Пятачок   (2009-09-23 12:55:00) [15]

хотя структурка придумана явно в угаре.

хотя бы вот это чудо чего стоит
TSomeRecord = record
  Value: Cardinal;
end;


Медвежонок Пятачок   (2009-09-23 12:54:00) [16]

можно по ссылке, можно по значению. здесь без разницы


Сергей М.   (2009-09-23 12:53:00) [17]

"Правильность" немало зависит от того, в какой среде разрабатывались хост-приложение и DLL


Наверх

Титульная страница Поиск, карта сайта Написать письмо