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

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

If @sa=nil then exit;//Функция не найдена

If @sa=nil then exit;//Функция не найдена - раздел Религия, Хранения формы в динамических библиотеках F:=Sa(Handle); Freelibrary(Dllhandle); End; Здесь У...

f:=sa(Handle); FreeLibrary(dllHandle); end;

Здесь у меня объявлено две локальные переменные:
dllHandle – здесь будет храниться указатель на загруженную библиотеку.
sa – имеет тип ShowA, т.е. тип функции из библиотеки.

 

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

Дальше, я вызываю функцию LoadLibrary. Эта функция загружает указанную в качестве параметра динамическую библиотеку в память. Результатом выполнения функции является указатель на загруженную библиотеку. Этот указатель я сохраняю в переменной dllHandle. После этого нужно проверить, если указатель dllHandle равен нулю, то библиотека не загрузилась.

Теперь нам надо получить адрес функции ShowAbout в загруженной памяти, чтобы мы могли выполнить процедуру. Для этого я вызываю функцию GetProcAddress. Процедуре нужно передать два параметра:

1. 1. Указатель на загруженную библиотеку.

2. 2. Имя искомой процедуры.

 

Результатом будет адрес искомой функции, и я его сохраняю по адресу переменной @sa. Теперь sa указывает на адрес, по которому загружена библиотека ShowAbout. Единственное, что надо проверить – корректность адреса. Если он равен nil, то процедура не найдёна (возможно, это старая версия библиотеки или неправильно указано имя).

Если всё нормально, то я вызываю функцию через переменную f:=sa(Handle), почти так же, как это делалось раньше. Результат выполнения функции сохраняется в переменной f.

Последняя строчка кода выгружает динамическую библиотеку из памяти -FreeLibrary. Точнее сказать, на этом этапе реальной выгрузки не происходит. Функция только сообщает системе о том, что больше библиотека программе не нужна. Если эту библиотеку использует другая программа (я же говорил, что одну библиотеку может использовать одновременно несколько программ), то она останется в памяти, пока та не сообщит о ненадобности в загруженном DLL файле.

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

 

18.7. Точка входа.

ы наверно заметил, что в исходнике библиотеки есть begin и end не относящиеся к ни одной из процедур или функций. Код, описанный здесь, выполняется самым первым при загрузке библиотеки в память. Но зачем это

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

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

DLL_PROCESS_ATTACH – это событие генерируется при загрузке библиотеки.

DLL_PROCESS_DETACH – это событие генерируется при выгрузке библиотеки.

DLL_THREAD_ATTACH – при создании нового потока.

DLL_THREAD_DETACH – при отключении нового потока.

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

Открываем нашу библиотеку, написанную в прошлой части. Теперь добавляем в неё следующий код:

library ProjectDLL;

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

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

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

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

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: If @sa=nil then exit;//Функция не найдена

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

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

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

Решение №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 f>0 then
FreeAbout(f); f:=ShowAbout(Handle); end; Здесь идёт проверка, если f больше нуля, то надо освободить память от старого окна, а потом пытат

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

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

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