рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

If f>0 then

If f>0 then - раздел Религия, Хранения формы в динамических библиотеках Freeabout(F); F:=Showabout(Handle); End;...

FreeAbout(f);

f:=ShowAbout(Handle); end;

Здесь идёт проверка, если f больше нуля, то надо освободить память от старого окна, а потом пытаться создавать новое.

По событию OnClose для главной формы тоже не помешает вызвать процедуру освобождения памяти. Если программа закрывается, то окно из библиотеки уж точно уже не понадобится, значит, переменную f можно проверять на 0 и если там большее значение, то освобождать память.

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

На компакт диске, в директорииПримерыГлава 18NoModalты можешь увидеть пример этой программы.

 

18.6. Явная загрузка библиотек.

 

редыдущие примеры хороши тем, что они просты, но у них есть недостаток – динамическая библиотека загружается автоматически при старте программы. В этом есть два недостатка. Во-первых, загрузка программы немного теряет в

скорости (не сильно, но всё же), а функции из библиотеки могут вообще не понадобиться за всё время выполнения программы. Во-вторых, тебе может понадобиться поставлять программу в укороченном варианте без некоторых функций (без каких-либо dll файлов), но это не получиться, потому что программа на этапе загрузке будет выдавать ошибку о том, что библиотека не найдена.

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

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

Итак, загружай приложение, написанное в прошлой части, которое использует динамическую библиотеку. В основном модуле убирай объявления функции ShowAbout, чтобы ничего не осталось. Теперь в разделе typeпиши объявление нового типа:

ShowA=function (Handle: THandle):LongInt;stdcall;

Здесь я объявляю новый тип ShowA, который равен функции с параметрами фкнуции ShowAbout из динамической библиотеки. Параметры должны быть точными, как при объявлении, иначе могут возникнуть проблемы.

Всё, этого достаточно. Теперь нужно переходить к обработчику события OnClick для первой кнопки, где мы показывали окно. Подкорректируй уже имеющийся код до следующего:

procedure TForm1.Button1Click(Sender: TObject);

var dllHandle:THandle; sa:ShowA;

begin if f>0 then FreeAbout(f);

dllHandle:=LoadLibrary('ProjectDLL.dll');

– Конец работы –

Эта тема принадлежит разделу:

Хранения формы в динамических библиотеках

Глава Динамически компонуемые библиотеки...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: If f>0 then

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Решение №1.
Самым первым решением этой проблемы стал модульное программирование. Ты пишешь какой-то кусок кода, оформляешь его в виде модуля, а потом просто используешь его в своих программах. Все прекрасно и

Проблема №1.
Давай представим ситуацию, когда один добрый человек написал прекрасный модуль размером в 1 мегабайт. Другой добрый человек решил воспользоваться его возможностями и подключил к своей программе. Мо

Проблема №2.
Пока существовали только однозадачные операционные системы, проблема с излишней растратой дискового пространства была единственной. Но как только задумались о многозадачности и в мыслях Билла Гейтс

Решение №2.
И вот тут было найдено вполне солидное решение: не стыковать модули с основной программой, а сохранять их в отдельный файл и пусть любая программа загружает его по мере надобности. Сказали, сделали

Из чего же сделан Windows?
Все наверно помнят такую песенку: "Из чего же, из чего же, из чего же, сделаны эти мальчишки?". Глупейшая песня, и я со слезами на глазах вспоминаю, как я в лагере (я имею ввиду пионерски

Графические движки.
Любой игрок обязан знать про существование OpenGL. Что это такое? Какой-то пакет программ? Какой-то SDK для создания графики? Ничего подобного, это всего лишь две динамические библиотеки opengl.dll

Begin end.
Если открыть менеджер проектов (Меню View->Project Manager), то в окне вообще не будет видно ни одного модуля. Это потому что код, который мы видели выше относиться к самой библиотеки. Вы

Begin end.
Обрати внимание, что функция у нас объявлена не так как всегда. В конце строки объявления, после типа возвращаемого значения стоит ключевое слово StdCall. Оно говорит о том, что дл

R:Integer; begin
r:=Summ(10,34); Application.MessageBox(PChar(IntToStr(r)), 'Результат функции Summ'); end; В первой строчке я вызываю функцию Summ с двумя

SysUtils, Classes; {$R *.RES} exports ShowAbout index 10; begin end.
Я добавил только одну строку exports ShowAbout index 10;. У нас будет только одна процедура ShowAbout с индексом 10. Эта процедура будет показывать окно «О программе».

Implementation
Обрати внимание, что первое описание процедуры я написал не в разделе type, а до него: procedure ShowAbout(Handle: THandle)stdcall; Это не являет

Function ShowAbout(Handle: THandle):LongInt;stdcall; procedure FreeAbout(FormRef: LongInt);export;stdcall
В разделе varпишем следующее: function ShowAbout;external 'ProjectDLL.dll' index 10; procedure FreeAbout;external 'ProjectDLL.dll' index 11; Всё

If @sa=nil then exit;//Функция не найдена
f:=sa(Handle); FreeLibrary(dllHandle); end; Здесь у меня объявлено две локальные переменные: dllHandle – здесь будет храниться указатель на загруженную библиот

DLLEntryPoint(DLL_PROCESS_ATTACH); end.
В разделе usesпоявилось объявление двух новых модулей windows и dialogs, без них наш код не скомпилируется. Чуть дальше появилась процедура DLLEntryPoint с одн

Begin end.
Первое, что здесь бросается в глаза – объявление в разделе typeнового типа – TCompProc. Новый тип объявлен как процедура с одним параметром в виде переменной типа PChar

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги