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

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

R:Integer; begin

R:Integer; begin - раздел Религия, Хранения формы в динамических библиотеках R:=Summ(10,34); Application.messagebox(Pcha...

r:=Summ(10,34);

Application.MessageBox(PChar(IntToStr(r)), 'Результат функции Summ'); end;

В первой строчке я вызываю функцию Summ с двумя числовыми параметрами. Результат записывается в переменной r. Вторая строка всего лишь выводит окно с результатом.

Если ты попытаешься сейчас откомпилировать проект, то у тебя ничего не выйдет. Компилятор Delphi скажет, что он не знает такой функции Summ. Мы должны показать Delphi, что это за функция и где её искать.

Для начала покажем компилятору, что это за функция. Для этого в разделе type, после описания объекта TForm1 (нашей главной формы) нужно написать следующую строку:

function Summ(X,Y:Integer):Integer;StdCall;

В принципе, это такое же объявление функции, которое описано в библиотеке, только здесь нет beginи endи самого кода процедуры. По этой строке Delphi узнаёт, что где-то существует такая функция Summ, у неё есть два параметра, и она должна вызываться стандартным вызовом.

Теперь нужно сказать компилятору, где же искать эту загадочную функцию. Для этого после слова implementationнапиши следующий код:

function Summ; external 'FirsDLLProject.dll' name 'Summ';

Здесь написано, что есть такая функция Summ. После точки с запятой стоит ключевое слово external, которое говорит о том, что функция внешняя, не принадлежит программе. После этого слова указывается имя динамической библиотеки, где нужно искать функцию. Далее идёт ключевое слово name, которое означает, что функцию надо искать по имени. После этого ключевого слова указывается точное имя функции в библиотеки.

Вот теперь проект готов и его можно компилировать, запускать и проверять результат.

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

В нашем примере использовался вызов по имени функции. Когда программе нужно выполнить функцию Summ, то она просматривает все функции динамической библиотеки и ищет функцию с указанным именем. Это очень неэффективно и перед первым вызовом будет ощущаться большая задержка. Чтобы хоть немного ускорить процесс вызова таких функций можно использовать индексы. Каждой функции в библиотеке может быть назначен индекс, и при вызове можно указывать его.

Давай подкорректируем наш пример на индексы. Открой проект динамической библиотеки FirsDLLProject.dpr. Найди ключевое слово exportи напиши там такой код:

exports Summ index 10;

После имени функции стоит ключевое слово indexи числовой индекс функции. Я люблю нумеровать свои функции, начиная с10. Этой я дал десятый индекс (ты можешь попробовать другое число. Индексы и имена должны быть уникальными!!! Вот несколько примеров:

exports Func1 index 10 name 'Fun', Func2 Insert, Func3 index 11, Func4 index 11,//Ошибка, такой индекс уже существует Func5 name 'Don';

В объявлении последней процедуры я явно использовал ключевое имя name, чтобы указать экспортной функции новое имя. Теперь внутри библиотеки эта функция реализована как Func5, но внешние приложения должны обращаться к ней по имени Don.

Объявлять можно и так:

exports Func1 index 10 name 'Fun', exports Func2 Insert, exports Func3 index 11,

Перекомпилируй проект, чтобы изменения вошли в силу (нажми Ctrl+F9).

Теперь возвращаемся в проект, где мы используем функцию. В разделе implementationподправляем описание нашей функции:

function Summ; external 'FirsDLLProject.dll' index 10;

Теперь вместо ключевого слова nameстоит слово indexи тот же номер.
Запусти проект и убедись, что он работает корректно.

 

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

 

18.3. Замечания по использованию библиотек.

огда я сказал, что DLL файлы нельзя запускать, то я и соврал, и нет. В принципе, библиотеки действительно нельзя запускать, но Delphi может сделать это. Открой нашу библиотеку и выбери из меню Run пункт

Parameters. Перед тобой откроется окно, как на рисунке 18.3.1.

В строке Host Application нужно указать имя приложения, которое умеет загружать библиотеку. Теперь попробуй запустить проект (клавиша F9). Запустить указанная программа.

Зачем нужен этот способ? Если ты попытался запустить программу, и она показала ошибку в коде, где вызывается функция из динамической библиотеки, то можно попытаться запустить библиотеку таким образом. Если снова произойдёт ошибка, то Delphi покажет строку с ошибкой.

Небного позже я покажу тебе, как можно отлаживать программы, выполнять их по шагам. Тогда ты сможешь узнать, что таким образом можно отлаживать и динамические библиотеки. А именно, они могут выполняться в пошаговом режиме (построчно) и ты будешь контролировать весь процесс выполнения.

Пока что я о библиотеках говорил достаточно много хорошего, но не сказал самого главного. Функции и процедуры из динамической библиотеки не могут прямо влиять на ход основной программы. Это значит, что мы не можем получить доступ к окнам основной программы, изменить какие-то переменные или ещё чего-нибудь.

Функции библиотеки – как бы изолированы от всего остального, хотя и выполняются в одном адресном пространстве с основной программой. Они могут использовать только переданные параметры, а результат работы возвращать в качестве результата работы функции.

Имена библиотек пиши полностью, вместе с расширением. Без расширения DLL может быть не найдена в Windows NT/2000/ХР, хотя в Windows 98 всё будет работать нормально.

Обязательно соблюдай индексы и параметры процедуры, иначе могут возникнуть ошибки. Лучше лишний раз проверить, чем потом долго искать опечатку.

 

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

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

разгружается от лишнего кода.

 

Ещё одно преимущество такого кода – библиотека может использовать для вывода информации на экран своё окно. Как я уже сказал, из dll файла нельзя получить доступ к переменным и данным основной программы. Это значит, что из DLL файла нельзя ничего вывести в окна основной программы. Но библиотека может создать собственное окно и использовать для вывода необходимых данных именно его.

Итак, создавай новую DLL библиотеку и сохрани её под именем ProjectDLL. Теперь добавим к нашей библиотеки одну экспортную процедуру ShowAbout:

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

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

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

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

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: R:Integer; begin

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

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

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

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

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

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

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

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

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

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

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

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 больше нуля, то надо освободить память от старого окна, а потом пытат

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
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги