• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Работа с Bpl (borland Package Library)

  • Автор темы nikolasiii
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

nikolasiii

Доброе время суток уважаемые посетители этого чудотворного сайта. :)
У меня вопрос!
//Разрабатываю MDI приложение
Есть такой код:

PackageModule := LoadPackage('MDIPackage.bpl');
//if loaded, try locating the ExecuteChild procedure
if PackageModule <> 0 then
try
@ExecuteChild := GetProcAddress(PackageModule,'ExecuteChild');
except
//display an error message if we fail
ShowMessage ('Package not found');
end;

В процедуре ExecuteChild создаётся MDI форма - MDIChild

В событии OnDestroy главной MDIParent формы происходит выгрузка процедуры ExecuteChild - мне не хочется так делать, так как память выгружается при завершении работы всего приложения.

Вопрос!!!
Как можно выгрузить процедуру, чтобы она не захламляла память, когда будет закрыта форма MDIChild?

Заранее благодарен.
 
N

nikolasiii

не процедуру выгрузить а память освободить.
Я хочу освободить память после того как закрылась MDI форма, которая была создана в вызванной процедуре, расположенной в bpl пакете.

не процедуру выгрузить а память освободить.
Я хочу освободить память после того как закрылась MDI форма, которая была создана в вызванной процедуре, расположенной в bpl пакете.
 
N

nikolasiii

нет.
ещё раз.
вот работает MDI приложение.
мы вызвали из bpl процедуру ExecuteChild
@ExecuteChild := GetProcAddress(PackageModule,'ExecuteChild');
if Assigned(ExecuteChild) then ExecuteChild();

в этой процедуре создалась форма MDIChild

вот теперь в каком месте сделать UnloadPackage(PackageModule)

откуда мы знаем при каких условиях закроется MDIChild.

поэтому есть вариант со вторым потоком, в нём отслеживать закрытие MDIChild
может быть есть ещё вариант с hooks, хотя я плохо в них разбираюсь.


А вот самый настоящий вариант, интересно мне знать, какой?

точнее сказать в каком месте выгрузить bpl.
 
N

nikolasiii

Я не совсем понял. А как он работает?
 
N

nikolasiii

дело в том, что я раньше никогда не работал с счётчиками ссылок. Само понятие знакомо, я даже вскользь читал об этом где-то, но сам не знаю и не использовал.

как называется это по английски?

а потом. куда это всё воткнуть??? где будет отслеживаться закрытие формы или она сама должна какое-то сообщение куда-то послать?
 
P

Pasha

Для: nikolasiii
Неужели MDIPackage.bpl занимает так много памяти, что его приходится постоянно загружать/выгружать? Занимает ли он физическую память вообще? Не будел ли дороже по ресурсам и по времени разработки страдать фигней с отдельными потоками и счетчиками ссылок?
IMHO все это - стремление к бесполезной преждевременной оптипизации.
 
N

nikolasiii

это всё стремление к правильному написанию программ.
Если занял память, будь добр освободи её если она тебе не нужна.

если такой способ есть, а он точно должен быть, то почему бы его не использовать.
 
P

Pasha

<!--QuoteBegin-nikolasiii+24:08:2007, 16:16 -->
<span class="vbquote">(nikolasiii @ 24:08:2007, 16:16 )</span><!--QuoteEBegin-->Если занял память, будь добр освободи её если она тебе не нужна.
[snapback]76309" rel="nofollow" target="_blank[/snapback]​
[/quote]А если пользователь решит закрыть единственное Child-окно, а потом открыть его еще раз. Тогда к твоему принципу надо дописать примерно следующее: "потом еще раз выдели, а потом еще раз осовободи, и еще раз выдели, и еще раз освободи...и получи фрагментацию."
И вообще, с чего ты взял что LoadPackage полностью загружает package в оперативную память, а не создает, например, файл, отображаемый в память? Не доверяешь разработчикам Dephi?
 
N

nikolasiii

в работе с памятью я тоже пас, хотя кое-где может и смогу разобраться.
здесь ситуация практически такая же как и с созданием объектов.
Объект создали, а потом его разрушили. Мы же не создаём объект на весь процесс работы приложения.
Так и здесь. Я не думаю что это займёт много времени.
А потом. Может со временем я все формы в bpl загоню. Я всё равно планирую на модули свои приложения разбивать.
 
P

Pasha

<!--QuoteBegin-nikolasiii+24:08:2007, 16:34 -->
<span class="vbquote">(nikolasiii @ 24:08:2007, 16:34 )</span><!--QuoteEBegin-->здесь ситуация практически такая же как и с созданием объектов.
[snapback]76311" rel="nofollow" target="_blank[/snapback]​
[/quote]Нет, здесь ситуация совершенно не такая, как с созданием объектов. Без базовых знаний о работе с памятью в windows объяснение выльется в долгую лекцию с картинками. Пока можешь просто поверить на слово: загрузка dll через LoadPackage уменьшает объем памяти, доступной для создания объектов, на совершенно мизерную величину.
 
N

nikolasiii

хорошо. так и быть. буду уничтожать bpl при закрытии приложения.
Спасибо за подсказки.

С уважением, Nikolasiii
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!