![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно передать из 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