Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.005 c
2-1296738757
Conflict
2011-02-03 16:12
2011.05.08
Диалог выбора папки ShBrowseForFolder с определенной директории


2-1296587747
Тимоха111
2011-02-01 22:15
2011.05.08
копировать массив в другой массив


3-1258102915
aleks
2009-11-13 12:01
2011.05.08
Нужна ли установка MSSQL на компьютере клиента?


11-1233446413
Thaddy
2009-02-01 03:00
2011.05.08
kolnmck.ru etc


15-1295641340
Интересующийся
2011-01-21 23:22
2011.05.08
Жаль что у вас нет раздела для сишников




   Наверх