Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.08;
Скачать: CL | DM;

Вниз

Как правильно передать из DLL?   Найти похожие ветки 

 
Игорь ©   (2009-09-23 12:51) [0]

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

type
 TSomeRecord = record
   Value: Cardinal;
 end;

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

 TMyRecord = Array of TSomeRecord2;


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

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


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

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


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

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

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


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


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


Delphi -> Delphi


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


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


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


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


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


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


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

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

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


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

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:23) [9]

ужас какой.

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


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

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


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


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


> stdcall


Ты же сказал

> Delphi -> Delphi


??

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


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


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


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


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

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

:)


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

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


 
Leonid Troyanovsky ©   (2009-09-23 13:56) [15]


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

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

or dynamic arrays
Shared-memory manager, RTFM.

--
Regards, LVT.


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
11-1233446413
Thaddy
2009-02-01 03:00
2011.05.08
kolnmck.ru etc


2-1296650084
Гражданин
2011-02-02 15:34
2011.05.08
Экран


2-1295949753
Тимоха111
2011-01-25 13:02
2011.05.08
Захват изображения части окна


15-1295904584
Юрий
2011-01-25 00:29
2011.05.08
С днем рождения ! 25 января 2011 вторник


1-1253717718
nes
2009-09-23 18:55
2011.05.08
Удаление строк-дубликатов в Tmemo - более быстрый способ