Главная страница
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.009 c
15-1295815945
Кто б сомневался
2011-01-23 23:52
2011.05.08
Запустить программу с пониженными правами из программы с админ пр


15-1294825167
usrg
2011-01-12 12:39
2011.05.08
О чем говориться в Eclipse Public License?


15-1295739103
Грамотей
2011-01-23 02:31
2011.05.08
Где взять скомпилированные dll от ODE?


3-1258364954
DelphiN!
2009-11-16 12:49
2011.05.08
Проверка корректности даты в TSQL


15-1295688133
boriskb
2011-01-22 12:22
2011.05.08
Эти задачи я записал в Париже весной 2004 года...