Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение и освобождение памяти в dll / bpl [D6, Win2k]


Толик ©   (2002-11-05 16:51:00) 

Уважаемые Мастера!
Как реализовать 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 -> использовать объект -> удалить объект.


han_malign   (2002-11-05 18:35:00) [1]

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


han_malign   (2002-11-05 18:18:00) [2]

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


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

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


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

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо