Реферат Курсовая Конспект
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;//Функция не найдена
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов