Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Begin end



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

Я тебе уже говорил, что все параметры, передаваемые в процедуры и в функции, передаются через стек. Если не указать ключевое слово StdCall, то параметры будут передаваться способом, заложенным фирмой Borland. Этот способ работает быстрее, но он не совместим со стандартными правилами. Если ты уверен, что к процедуре будут обращаться только программы скомпилированные компиляторами фирмы Borland, то можешь не ставить это ключевое слово. Но если библиотека будет выложена на всеобщее использование или к ней будут обращаться программы сторонних разработчиков, то желательно ставить StdCall, иначе у программистов на языках Visual C++ или других языках будут проблемы. Я сделал для себя правилом всегда ставить StdCall, потому что способ Borland даёт незначительный выигрыш.

В остальном, функция ничем не отличается от тех, что мы уже писали.

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

Теперь откомпилируй проект (нажми Ctrl+F9 или выбери из меню Project пункт Compile FirsDLLProject), чтобы создать нашу динамическую библиотеку. Можешь не пытаться запускать проект, потому что это библиотека, и она не может выполняться самостоятельно. Так что, единственное, что ты можешь увидеть – ошибку.

Теперь напишем программу, которая будет использовать написанную функцию из динамической библиотеки. Создай новый проект простого приложения (File->New->Application). На форму брось только одну кнопку и по её нажатия напиши следующий код:

procedure TForm1.Button1Click(Sender: TObject); var

r:Integer; begin

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, которое означает, что функцию надо искать по имени. После этого ключевого слова указывается точное имя функции в библиотеки.

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

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

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

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





Дата публикования: 2014-11-28; Прочитано: 224 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...