Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
8-45999
Antonius
2002-07-25 13:41
2002.11.14
Вопрос по 3D sound, библиотека BASS


1-45933
wer1
2002-11-04 04:38
2002.11.14
Мастера подскажите! Копирование из буфера в Memo.


4-46185
Th
2002-10-02 20:20
2002.11.14
Как Bitmap поместить на DC?


3-45668
Sten
2002-10-27 21:16
2002.11.14
Filter or Sort.


3-45674
Shil
2002-10-23 22:17
2002.11.14
Подскажите какой тип данных выбрать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский