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