VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Язык программирования Delphi.
Написание и подключение DLL
:
Logo

Мне уже пришло два письма с просьбой описать работу DLL файлов. Хотя этот номер уже перегружен статьями о Delphi, я решил не дожидаться следующего месяца и выполнить эту просьбу. Я думаю, что эта статья заинтересует многих. Готовься, сегодня мы напишем DLL файл и проект, который загрузит эту DLL.
Logo
Рис 1. Создание DLL

Начнём с создания DLL. Первое, что надо сделать, это создать соответствующий проект. Щёлки File->New. Перед тобой откроется уже знакомое окно создания проекта. Выбери пункт DLL и щёлкай "ОК" (рис. 1). 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.
Logo
Рис 2. Форма из DLL

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

Переходи в текст модуля. В разделе 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;

Запускаем и наслаждаемся. Удачи тебе.


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©