Tasuta

Иcпользование API на Delphi 7

Tekst
Märgi loetuks
Šrift:Väiksem АаSuurem Aa

end;



procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);



{ Остановка сервера }



begin



  ServerSocket1.Close;



end;



procedure TForm2.ServerSocket1Listen(Sender: TObject;



  Socket: TCustomWinSocket);



{ Ожидание подключения клиентов }



begin



  ListBox1.Items.Text:='Server is active…';



end;



ЛЕКЦИЯ №6

1. РАЗРАБОТКА DLL – БИБЛИОТЕК

Язык программирования Delphi является языком визуального объектно-ориентированного программирования (ООП). В современных программах, совместно с ООП, очень часто используется и модульный принцип создания программ. Наибольшее развитие данная технология получила в форме разработки динамически загружаемых DLL-библиотек. DLL-библиотека представляет собой отдельный файл с расширением «DLL», в котором находятся какие-либо процедуры и функции. Они становятся доступными при подключении к программе DLL-файла.



При подключении DLL-библиотеки к программе она загружается в оперативную память компьютера и находится там до завершения программы. Если запускается несколько программ, и всем им нужна одна и таже DLL-библиотека, то она загрузится в память в одном экземпляре, а выгрузится из памяти при закрытии последней (использующей библиотеку) программы.



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



Прикладная программа на Delphi может подключать DLL-библиотеку двумя способами: динамическим и статическим. При статическом способе DLL-библиотека автоматически подключается при запуске программы и автоматически деактивируется при ее завершении. Если указанный DLL-файл будет не найден, то возникнет ошибка выполнения программы. При динамическом способе DLL-библиотека подключается и отключается в нужное программисту время, при этом обеспечивается контроль над ошибочными ситуациями (например, если DLL-файл не найден).



Для создания файла DLL в Delphi необходимо выбрать пункт меню: «File -> New Item -> DLL wizard». Исходный код DLL-библиотеки нужно набрать в открывшимся окне и сохранить как файл с расширением «DPR». Никакие формы и файлы с расширение «PAS» здесь не используются.



Для одновременной отладки и создания программы и DLL-библиотеки лучше всего запустить две копии «Delphi» и в них работать отдельно.



1.1. Пример простейшей библиотеки DLL



library demo_dll;



function sc(x: real): real export; stdcall; { Функция расчета }



begin



  xsin:=sin(x)+ cos(x);



end;



exports sc; { Экспорт процедур и функций для внешних программ }



begin { Секция инициализации библиотеки DLL }



end.



end.



1.2. Пример использования библиотеки DLL



unit Demo_dll;





var Form1: TForm1;



function sc(x: real): real; stdcall; external 'demo_dll.dll'; { Подключение функции из DLL-библиотеки }



implementation



procedure TForm1.Button1Click(Sender: TObject);



begin



  showmessage(floattostr(sc(5)));



end;



1.3. Пример расширенной библиотеки DLL



library repa;



uses SysUtils, Classes, Windows, Registry, StdCtrls;



procedure Save1(edit1_text: pchar; mm1: pchar; scrollbar1_position: integer); export; stdcall;



// Сохранение данных в реестр



var nfile, s: string; t: tregistry; i,k: integer; m1: tstrings;



begin



  m1:=TStringList.Create; m1.Text:=mm1;



  t:=tRegistry.Create;



  t.RootKey:=HKEY_CURRENT_USER;



  t.OpenKey('\Software\is-302\tsn-12', true);



  t.writestring('', 'repa.dll');



  t.WriteString('Edit1_text', edit1_text);



  k:=m1.count;



  t.WriteInteger('memo1_count', k);



  for i:=0 to m1.Count-1 do begin



    s:=m1; t.Writestring('memo1_L'+inttostr(i+1), s);



  end;



  t.WriteInteger('scrollbar1_position', scrollbar1_position);



  t.closekey; m1.Free;



  t.Free;



  end;



procedure Load1(var edit1_text: pchar; var mm1: pchar; var scrollbar1_position: integer); export; stdcall;



// Считывание данных из реестра



var path_pr, nfile, s,m: string; t: tregistry; i,k,l: integer; m1,edit: tstrings;



begin



 m1:=TStringList.Create;



  t:=tRegistry.Create;



  t.RootKey:=HKEY_CURRENT_USER;



  t.OpenKey('\Software\is-302\tsn-12', true);



   m1.text:='';



   try



    edit1_text:=pchar(t.Readstring('edit1_text'));



   except



    edit1_text:='????';



   end;



  try



  k:=t.readInteger('memo1_count');



  for i:=0 to k-1 do begin



    s:= t.readstring('memo1_L'+inttostr(i+1));



    m1.Add(s);



  end;



  except



  end;



  mm1:=pchar(m1.text);



  try



   l:= t.readInteger('scrollbar1_position'); scrollbar1_Position:=l;



  except



  end;



  t.closekey; m1.Free; t.Free;



end;



procedure Clear1(var edit1_text: pchar; var mm1: pchar; var scrollbar1_position: integer); export; stdcall;



// Очистка данных



begin



  edit1_text:=''; mm1:=''; scrollbar1_position:=0;



end;



exports Clear1, Save1, Load1;



begin



end.



1.4. Пример использования расширенной библиотеки DLL


<