Форум: "Основная";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];
ВнизКак правильно передать из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c