Главная страница
    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.008 c
1-45845
Guest2
2002-11-05 12:56
2002.11.14
Как автоматически проматывать ScroolBar?


3-45759
niiot
2002-10-24 18:32
2002.11.14
Вопросы по базам данных


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


3-45720
VikOss
2002-10-23 17:51
2002.11.14
TUpdateQuery


14-46139
][Rih@rd][
2002-10-26 08: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
Английский Французский Немецкий Итальянский Португальский Русский Испанский