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