| Мне уже пришло два письма с просьбой описать работу DLL файлов. Хотя этот номер уже перегружен статьями о Delphi, я решил не дожидаться следующего месяца и выполнить эту просьбу. Я думаю, что эта статья заинтересует многих. Готовься, сегодня мы напишем DLL файл и проект, который загрузит эту DLL. Создание DLL Начнём с создания DLL. Первое, что надо сделать, это создать соответствующий проект. Щёлки File->New. Перед тобой откроется уже знакомое окно создания проекта. Выбери пункт DLL и щёлкай "ОК". Delphi создаст тебе пустой проект DLL файла. Выглядит он так: library ProjectDLL; { Здесь идёт куча информативных строк. } uses SysUtils, Classes; {$R *.RES} begin end. В качестве информативных строк тебя предупреждают, что если ты будешь использовать динамические строки, то надо подключить в раздел uses модуль ShareMem. Я этот модуль не подключил, потому что для примера мы не будем использовать строки. Удаляй эти комментарии, чтобы они не мозолили твои глаза. Мы засунем в DLL файл одну лишь процедуру и одну форму, поэтому сейчас мы должны это описать: library ProjectDLL; uses SysUtils, Classes; {$R *.RES} exports ShowAbout index 10; begin end. Я добавил только одну строку exports ShowAbout index 10; . Что это означает? Ключевое слово export говорит о том, что я буду экспортировать процедуру или функцию. После этого идёт имя этой процедуры ShowAbout . Далее идёт ключевое слово index и число. Каждой процедуре, которую ты хочешь экспортировать ты должен назначить индекс или имя (можно и то и другое сразу). По этому индексу или имени программа будет вызывать экспортируемую функцию. Индексы и имена должны быть уникальными!!! Вот несколько примеров: exports Func1 index 10 name 'Fun', Func2 Insert, Func3 index 11, Func4 index 11,//Ошибка, такой индекс уже существует Func5 name 'Don'; Через индексы функции вызываются быстрее, поэтому я использую их. Объявлять можно и так: exports Func1 index 10 name 'Fun', exports Func2 Insert, exports Func3 index 11, Но это всё примеры. У нас будет только ShowAbout с индексом 10. Форма из DLL Теперь щёлкаем File->New Form , чтобы создать новую форму. Переходи в текст модуля. В разделе var, после объявления формы опиши процедуру ShowAbout: var Form1: TForm1; procedure ShowAbout(Handle: THandle);export;stdcall; Опять присутствует ключ export и добавлен ещё stdcall. Второй ключ говорит о том, что нужно использовать стандартный вызов. Теперь напишем саму функцию после implementation и ключа {$R *.DFM}: procedure ShowAbout(Handle: THandle); begin //Установить указатель на приложение Application.Handle := Handle; //Создать форму Form1:= TForm1.Create(Application); //Отобразить Form1.ShowModal; //Очистить Form1.Free; end; Откомпилируй (Ctrl+F9) и DLL-файл готов. Можно закрывать этот проект (File->Close All) и создавать новый (File->New Application). В новом проекте переходим в текст формы и объявляем функцию ShowAbout: unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; procedure ShowAbout(Handle: THandle)stdcall; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure ShowAbout;external 'ProjectDLL.dll' index 10; implementation Объявление происходит два раза. Первый раз после раздела uses и перед type нужно написать procedure ShowAbout(Handle: THandle)stdcall; . А второй раз в разделе var пишем procedure ShowAbout;external 'ProjectDLL.dll' index 10; . Здесь в кавычках стоит имя DLL файла. Пиши его полностью (вместе с расширением), потому что без расширения DLL будет не найдена в Windows NT. Обязательно соблюдай индексы и параметры процедуры. При втором объявлении параметры указывать не надо, только имя. Теперь ставим на форму кнопочку и пишем по её событию procedure TForm1.Button1Click(Sender: TObject); begin ShowAbout(Handle); end; Запускаем и наслаждаемся. Удачи тебе.
|