Реферат Курсовая Конспект
Хранения формы в динамических библиотеках - раздел Религия, Глава 18. Динамически Компонуемые Библиотеки....................
|
Глава 18. Динамически компонуемые библиотеки................................................................ 411
18.1. Что такое DLL? .............................................................................................................. 412
18.2. Простой пример создания DLL .................................................................................... 416
18.3. Замечания по использованию библиотек. .................................................................. 419
18.4. Хранения формы в динамических библиотеках. ....................................................... 420
18.5. Немодальные окна в динамических библиотеках...................................................... 423
18.6. Явная загрузка библиотек. ........................................................................................... 426
ы уже наверно много раз слышал заветное выражение «динамически компонуемые библиотеки. Пора познакомиться с ними поближе. В этой главе я постараюсь тебе дать всю необходимую информацию по ним, мы напишем несколько примеров, и ты всё прекрасно увидишь на практике.
В отличии от остальных глав, в этом вступительном слове я больше ничего говорить не буду, потому что если затронуть тему описания предназначения DLL файлов, то тема растянется в долгий разговор, поэтому я посвящу этому первую же часть этой главы.
18.1. Что такое DLL?
рограммисты всех стран уже более 30 лет борются с проблемой многоразового использования однажды написанного кода. Так уж повелось, что 30-50% кода в простых офисных приложениях схожи между собой или
решают одни и те же задачи. Ни один программист не захочет каждый раз снова писать один и тот же код. Как хорошо, когда можно использовать один раз написанный код многократно ....
Я сам не люблю в каждой новой программе писать одно и то же. Как хорошо, когда написал какой-то универсальный код, а потом только используешь его.
Procedure TForm1.Button1Click(Sender: TObject); var
Library ProjectDLL; uses
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;
Эта процедура получает в качестве параметра указатель на главное приложение. В первой строке я устанавливаю этот указатель в свойство Handle объекта Application. Этот объект хранит настройки всего приложения, и этим присваиванием мы связали оба приложения.
Во второй строке кода я создаю окно TForm1.Create(Application), в результате чего мне будет возвращён указатель на это окно. Результат я сохраняю в переменной Form1. Эта переменная объявлена в разделе varпроекта.
Следующей строкой я отображаю модально созданное нами окно. Как только оно закроется, будет выполнена последняя строка кода этой процедуры, а именно, окно будет уничтожено из памяти и процедура закончит своё выполнение.
В процедурах DLL библиотек будь более внимателен к высвобождению памяти. По моей практике могу сказать, что ошибки в библиотеках переносятся программами более критично, потому что тут основная программа практически бессильна.
Откомпилируй библиотеку (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;
Procedure TForm1.Button1Click(Sender: TObject); begin
If dllHandle=0 then exit;//Библиотека не загрузилась
@sa:=GetProcAddress(dllHandle, 'ShowAbout');
Uses
SysUtils,
Classes,
Windows,
dialogs,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
exports ShowAbout index 10; exports FreeAbout index 11;
Procedure DLLEntryPoint(dwReason:DWord); begin
Case dwReason of
DLL_PROCESS_ATTACH:ShowMessage('Attach to process');
DLL_PROCESS_DETACH:ShowMessage('Detach to process');
DLL_THREAD_ATTACH:ShowMessage('Thread attach to process');
DLL_THREAD_DETACH:ShowMessage('Thread detach to process');
end; end;
Begin
DLLProc:=@DLLEntryPoint;
Type
TCompProc= procedure(Str:PChar);StdCall;
procedure CompS(Str:PChar; Proc:TCompProc);export;StdCall;
В первой строке я объявляю тот же процедурный тип, что и в динамической библиотеке. Во второй строке объявляется процедура, которую мы экспортируем из библиотеки. Объявление должно быть именно в таком порядке. Если ты попытаешься объявить сначала процедуру из библиотеки, то при компиляции Delphi выдаст ошибку, потому что в качестве второго параметра в процедуре стоит тип TCompProc и сначала его нужно описать, а потом использовать.
Теперь напишем процедуру CallFromDLL. Эта процедура будет вызываться из динамической библиотеки. Она будет выглядеть так:
procedure CallFromDLL(Str:PChar);StdCall; begin ShowMessage('DLL вызвала эту процедуру. Параметр равен: '+Str); end;
Наша процедура должна соответствовать объявленному типу TCompProc, а именно, в типе описано, что это процедура, что она имеет один параметр типа PChar и вызывается стандартно. Процедура должна соответствовать всему этому описанию, иначе произойдёт ошибка.
Внутри процедуры я вызываю только одну функцию ShowMessage, которая показывает на экран окно сообщения. В качестве единственного параметра нужно указать текст сообщения.
Теперь пометим на форму кнопку и по её нажатию напишем следующий код:
procedure TForm1.Button1Click(Sender: TObject); begin CompS('Привет', @CallFromDLL); end;
Здесь я просто вызываю процедуру CompS, хранящуюся в динамической библиотеки. Попробуй запустить приложение и проверить результат работы программы.
На компакт диске, в директорииПримерыГлава 18Callты можешь увидеть пример этой программы.
– Конец работы –
Используемые теги: хранения, формы, динамических, библиотеках0.08
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Хранения формы в динамических библиотеках
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов