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

Вниз

Выделение и освобождение памяти в dll / bpl   Найти похожие ветки 

 
Толик ©   (2002-11-05 16:51) [0]

Уважаемые Мастера!
Как реализовать subj таким образом, чтобы эта память не освобождалась при выгрузке данного bpl?
Изначально идея была такой:
Есть некий интерфейсный класс

TParent = class(TObject)
public
procedure UseObject(); virtual; abstract;
...
end;

Есть наследник, расположенный в bpl

TChild = class(TParent)
public
constructor Create();
procedure UseObject(); override;
...
end;

также, в bpl есть экспортируемая ф-я, возвращающая экземпляр класса-наследника:

function CreateChild(): TParent;
exports
CreateChild index 1 name "CreateChild";

function CreateChild(): TParent;
begin
RESULT := TChild.Create();
end;

Использование объекта происходит следующим образом:

procedure UseChild();
type
TChildCreate = function(): TParent;
var
Pkg: HMODULE;
begin
Pkg := LoadPackage("package.bpl");
try
with TChildCreate(GetProcAddress(Pkg, pchar(1))() do
try
UseObject();
finally
Free();
end;
finally
UnloadPackage(Pkg);
end;
end;

А вот теперь вопрос: bpl выделяет память под объект и больше он не нужен ни для чего. Как сделать так, чтобы его можно было выгрузить без разрушения созданного им объекта? Т.е. загрузить bpl -> создать объект -> выгрузить bpl -> использовать объект -> удалить объект.


 
Толик ©   (2002-11-05 17:33) [1]

поехали наверх.


 
Андрей Прокофьев ©   (2002-11-05 17:37) [2]

>>bpl выделяет память под объект и больше он не нужен ни для чего
?!

Только
загрузить bpl -> создать объект ->использовать объект -> удалить объект-> выгрузить bpl


 
Толик ©   (2002-11-05 17:44) [3]

to Андрей Прокофьев © (05.11.02 17:37)
Как видно из кода, сейчас именно так и происходит.
Вопрос заключается в том, как создать объект так, чтобы его можно было использовать после выгрузки пакета.


 
han_malign ©   (2002-11-05 18:18) [4]

Никак - у него VMT лежит в BPL, при первом обращении к виртуальному методу все рухнет.
З.Ы. Конечно крутая оптимизация, когда работает программный код выгруженный из памяти - это вам к вызывающим духов.


 
han_malign ©   (2002-11-05 18:35) [5]

З.З.Ы. В этом весь смысл плуджинов, что подгружается дополнительный код и в BPL находится как раз ваша дополнительная функциональнось, без которой содержимое(Instance, экземпляр)объекта вам в общем то и не к чему.
З.З.З.Ы. вполне можно сделать плуджин и без объектов
Plugin.Do будет работать не хуже и не лучше чем Do(pPluginInstance)
где Plugin - экземпляр объекта,
pPluginInstance - блок памяти для хранения настроек/состояния,
а Do в одном случае метод объекта, а в другом статическая функция/процедура. НО И В ТОМ И В ДРУГОМ СЛУЧАЕ КОД ЛЕЖИТ В BPL



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

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

Наверх




Память: 0.48 MB
Время: 0.024 c
14-46119
IronHawk
2002-10-20 12:04
2002.11.14
Киевская встреча Мастаков СОСТОЯЛАСЬ!


8-46012
MOleg
2002-07-24 19:11
2002.11.14
DirectX и Delphi6.


3-45664
Леший
2002-10-23 17:43
2002.11.14
Создание базы


1-45850
kva
2002-11-05 09:04
2002.11.14
Крыша едет от re-raise


4-46196
АндрейС
2002-10-04 13:55
2002.11.14
собственная кнопка