АЛТЫНОРДА
Новости Казахстана

Реферат. Турбо Паскаль тілінің динамикалы байланысатын кітапханалары

 

 

Жоспар

 

Турбо Паскаль тілінің динамикалы байланысатын кітапханалары

І Кіріспе

 

ІІ Негізгі бөлім

         а) Динамикалы қосылатын кітапханалар.

         б) Динамикалы байланысатын кітапханаларды құру.

         в) ДИ-ден процедуралар мен функцияларды импорттау.

         г) Статикалық және динамикалық жүктеулер

         д) Динамикалы байланысатын кітапханаға форманы енгізу

             программасы

 

ІІІ Қорытынды

 

Қолданылған әдебиеттер

 

 

 

 

 

 

Динамикалы байланысатын кітапханалар

 

Динамикалы байланысатын кітапханалар – Dinamically Linked Libraries (DLL)   — Dos Windows режимдерімен жұмыс жасау кезінде енгізілге программаларға қосымша мүкіндіктер береді. Және де олар компютердың тек BP. EXE, BPC. EXE, BPW. EXE  версияларымен ғана құралған болуы мүмкін.

Қазіргі таңда стандарттық динамикасы байланысатын кітапханалардың (DLL)  программамен жабдықтауды программистерге келешекте стандартты программалармен қатар қолдануға мүмкіндік беретін өз  динамикалы байланысатын кітапханаларын (ДИ) құруға мүмкіндік береді, сондай фирмалардың бірі – Borland Pascal With Object.

Алғашында динамикалы байланысатын кітапханалар  Windows-тың бөлімдерінде қолданылған. Borland Object динамикалы байланысатын кітапханаларды Dos режимі үшін де жұмыс жасауға мүмкіндік жасады.

ДИ сияқты кітапханалардың құндылығы- олардың оперативті жадты жүктегеннен кейін де енгізілген программалармен қатар, олар Ди-дің Windows үшін жұмыс істеуімен бірдей болады. Бұл құрылым  жұмыс жасаушыларға Dos-та қалай жұмыс істесе Windows-та да дәл солай жұмыс істеуге де программалар құруға мүмкіндік береді.

Сонымен қатар, ДИ «көп тілді» проекттерді қолдайды,

яғни: Borland Pascal With Object  тілінде жазылған программаларда басқа тілдерде жазылған ДИ, ал басқа тілдерде жазылған программаларда Borland Pascal With Object тіліндегі ДИ қолданылады.

 

 

 

 

Динамикалы байланысқан кітапханалардың жазылу синтаксисі келесі түрге ие:

               
         
 

Кітапхана

 

     
 
 

 

 

 

 

 

идентификатор

 

 

 

 

         «Динамикалы байланысқан кітапхана» -тілдің құрылымы бір жағынан модуль құрылымының жалғасы мен өнімі болса, екінші жағынан онымен салыстырғанда кейбір шектеулерге ие болып табылады.

         ДИ –дің ерекшелігі келесі түрдегі белгілермен анықталады:

  • Негізгі программадағы модульдердің компоненттері статистикалық түрде тек компотентция кезінде ғана орындалады, ал ДИ – программаның орындалу барысында динамикалы болып табылады. Бұның өзі бір уақытта жұмыс істейтін бірнеше программалар үшін әрқайсысынан қолданылған функциялар мен процедуралардың тек бір ғана көшірмелерін оперативтік жадта ұстап тұруға мүмкіндік береді.
  • Модульді қоспағанда, ДИ-дің кодтары мен ресурстары оған қолданылып отырған программада компанантталады, ДИ-типті арнайы орынлатын файлда болады.
  • Программа арқылы шақырылған ДИ-дің функциялары мен процедуралары онымен тек динамикалы түрде ғана байланысады.
  • ДИ-дің модульмен салыстырғандағы шектеулігі мынада, модульдер шектеулігі тілдік бірліктерді (типтер, тұрақтылар, айнымалылар және т.б) импорттай алады, ал ДИ тек қана функциялар мен процедураларды ғана. Бірақ, ДИ тек айнымалыларды қамтамасыз ете алад, ал модульдер болса, оларды қолдану үшін импорттай алмайды. ДИ-дің айнымалыларына кез-клген байланыс процедуралық интерфейе арқылы жасалынған болуы тиіс.
  • Қолданылуы арқылы құрылып, компиляциялауға жіберілген программаларға қолданылған ДИ модульдер сияқты автоматты түрде компиляцияланбайды. Оны, яғни, ДИ-ді арнайы (жеке) компиляциялау талап етіледі.

 

Динамикалы қосылатын кітапханалар

Динамикалы қосылатын кітапханалар (Dinamik Link Library) сіздің программаңызға Object Pascal программалау тілінде басқа бір программистің жазған функциялары мен процедураларын интегралдаудың әмбебап механизмін ұсынады. ДИ жұмысқа дайын процедуралар, функциялар немесе ресурстардан құралған жасанды модуль түрінде реакцияланады. Программисттердің болжауынша, ДИ мен жай ғана Object Pascal модульдерінің арасында үлкен ұқсастық болады, себебі бұлардың екеуі де программистерге программаның басында өз кодтарын жазудан бас тартуға  мүмкіндік береді. Бірақ, принциптік айырмашылықтары да бар Бұлардың ішіндегі ең негізгісі ДИ-дің программасын орнатуға мүмкіндігі жоқ айнымалылар, тұрақтылар және типтер болып табылады. Себебі, Ди-ді жасаушылар программалау тілдерінің типсіз түрін, ассамблерді  қолдана алады. Нәтижеде, ДИ бүгінгі таңда программистер үшін өте қажетті болып табылатын кластарды программаға экспорттай алмайды. Бұл үшін тек пакеттер ғана қолданылады. Тағы бір негізгі айырмашылық болып табылатыны – программаларының байланысу әдістері. Модульдер программамен тек компоненттеу бөлімі арқылы байланысады. Егер бірдей модульді екі программа іске қосылған болса, онда жадта бірдей прагменттегі кодтардың екі данасы болады. Сонымен қатар ДИ программаға орындалу кезінде қосылады.  Егер тағы да екі программа бірдей кітапхана ДИ-ді қолданған болса, онда программа арқыл кодтарды айырудың тек бір ғана данасы жадта сақталады. Бұл компьютердің физикалық жады екендігін анықтауға тура келеді. Әрбір программа өзінің орналасуына қарай белгілі бір орын алады да бұлар ДИ кітапханаларының бейнесі ретінде көрінеді. Динамикалық қосылу ДИ-ге модульдер арқылы мағынасы онша қажетті бола қймайтын мәліметтерді береді. Олар: ДИ кітапханасының кез-келген өзгертулері қолданылып отырған программаның міндетті түрде ауыспалы болуын талап етеді.

 

ДИ-ден процедуралар мен функцияларды импорттау

Borland Pascal With Object   тілінде жазылған программалар мен модульдер ДИ-ден процедуралар мен функцияларды үш тәсілмен импорттай алады.

  1. Атауы бойынша
  2. Жаңа Атауы бойынша
  3. Ретті номері бойынша

 

Процедуралардың немесе функциялардың импорттаудағы фактілері оның программаларына немесе модульдеріне сай келетін жазбаларында көрсетілген Ди-ден импортталған процедуралар мен функциялар мына талаптарды қанағаттандырулары тиіс.

  • Міндетті түрде External процедуралық мәліметі қолданылуы керек.
  • ДИ-дің атауы External мәліметінен кейін көрсетіледі.
  • Процедуралық far  мәліметі арқылы немесе компилятордың {$ F +} мәліметі арқылы орнатылған модель қолданылуы керек.

Атауы бойынша импорттау процедуралар немесе функциялар жазылуында index және name мәліметтері бар болған жағдайда ғана өз атауларымен импортталады.

Мысалы:

 
 

Procedure MyProc; external’  MYLIB’;

 

 

 

 

 

        Бұл жазылымда MyProc процедурасы MYLIB динамикалы байланысқан кітапханадан өз атауы бойынша, яғни MyProc деп импортталады.

        Жаңа атауы бойынша импорттау.

Егер процедура немесе функция бөлімінде name мәліметі көрсетілген болса, онда ол өз атауы бойынша емес name-ге көрсетілген атау бойынша импортталады.

Мысалы:

 
 

Procedure MyProc; external’  MYLIB’; name ‘NEWNAME’

 

 

 

 

 

 

         Бұл жазылымда MyProc процедурасы MYLIB динамикалы байланысқан кітапханадан өз атауы бойынша Яғни, MyProc бойынша емес, жаңа бір атау  NEWNAME бойынша импортталады. Бұл жаңа атау үшін кез-келген тұрақты шаманы алуға болады.

         Реттік номері бойынша импорттау

Егер процедура немесе функция бөлімінде index мәліметі көрсетілген болса, онда ол өз атауы бойынша емес Іndex мәліметіне көрсетілгенмен импортталады. Мұндай импорттау модульдік жүктелу уақытын азайтады.

Мысалы:

 
 

Procedure MyProc; external’  MYLIB’index 7;

 

 

 

 

 

 

         Бұл жазылымда MyProc  процедурасы MYLIB динамикалы  байланысқан кітапханадан 7 индексі бойынша импортталады.

 

         Статикалық жүктеу

 type

         TComplex = record

         Re, Im :  Real:

         end:

function  ADDC (x,y: TComplex): TComplex: stdcall: External “Cmp lx. dll” :

   function Subc (x,y: TComplex): TComplex: stdcall: External “Cmp lx. dll” :

   function Mulc (x,y: TComplex): TComplex: stdcall: External “Cmp lx. dll” :

   function Divc (x,y: TComplex): TComplex: stdcall: External “Cmp lx. dll” :

   Procedure TfmExample. bbRunClick  (Sender: TObject):

   vai

         x,y, z: TComplex

…// ары қарай bbRunClick мәтінін қараша

   // Source (Chap — 02) Custom Variant/ Unit 1. Pas файлында

end:

end:

         Cmplx ADD функциясы келесі түрдегі ADDC атауына ие екендігіне көңіл аударыңыз. Жоғарыда көрсетілген мысалда дәл осылай жазылған. Егер біз төмендегідей етіп жазсақ, ол идентификаттанбас еді.

         Function AddC (x,y: TComplex): TComplex: stdall: External’ Cmplx. Dll:

 

 

Динамикалық жүктеу

         ДИ-дің функциялары мен процедураларының жоғарыда жазылған әдісі бойынша, компилятор барлық ДИ кітапханаларының тізімін программаның бөіліміне орналастырады. Программа External мәліметінсіз -ақ  ДИ-ді жүктей алады. Бұл әдіс стандартты үш функция арқылы жүзеге асады. Олар Loadlibrary, GetProcAddress  және  FreeLibrary.

      type

         TComplex = record

         Re, Im :  Real:

         end;

   TcomPlexFunc = finction (x,y: TComplex): TComplex: stdcall:

   Procedure TfmExample. bbRunClick  (Sender: TObject):

   vai

         x,y, z: TComplex

ADDC. Subc . Mulc. Divc: TcomPlexFunc

Handle: LongWord:

Procedure Output (Operation: Char):

… // OutPut  процедурасының денесі өзгеріссіз қалады.

end: // OutPut

 

begin // bbrunClick

// CMPLX. ДИ кітапханасын жүктейміз

Handle: = LoadLibrary (‘Cmplx. Dll’);

If Handle = O then

Begin

         ShowMessage (‘CMPLX. DLL  кітапханасы табылмады’):

Halt

end.

 Функцияның адресін анықтаймыз. Алғашқы үшеуін индексі бойынша, төртіншісін атауы бойынша.

         Addc : = GetProcAddress (Handle. PCRar (LongInt (1))).

         Subc : = GetProcAddress (Handle. PCRar (LongInt (2))).

         MUEC : = GetProcAddress (Handle. PCRar (LongInt (3))).

         Divc : = GetProcAddress (Handle. ‘Divc’):

 

  1. re : = Random;
  2. im : = Random;
  3. re : = Random;
  4. im : = Random;

OutPut (‘+’);

OutPut (‘-’);

OutPut (‘*’);

OutPut (‘/’);

Mm OutPut. Lines. Add (‘  ’);

// кітапхананы босатамыз

FreeLibrary (Handle)

end;

 

Динамикалы байланысатын кітапханаларға форманы енгізу программасы.

 

ДИ-дің формасының жоқтығына қарамастан, онымен байланысқан модуль арқылы форманы шақыруға болады. Осыған орай, кітапханада форманың модулімен байланысқан uses сілтемесі пайдаланылады.

         1) Librari  DUWIThForm;

         uses

         Sysutils;

         Classes;

         DUFormu in ‘DUFormu. Pas’ {DUForm};

         {$R *. Res}

         exports

                   ShowModalForm. ShowForm, FreeForm;

         begin

         end.

         2) Unit DLLFormU;

               interface

               uses

               Windows. Messages. SysUtils. Classes. Graphics. Controls. Forms. Dialogs. Stdctols. Buttons:

         type

                   TDLLForm = Class (TForm)

                   BitBtn 1: TBitBtn:

                   BitBtn 2: TBitBtn:

         Procedure FormClose (Sender: Tobject; var Action: TCloseAction);

         Private

         {Private declarations}

         Callform : THandle : //  шақырылатын форманың дискрипторы Public

         {Public declarations }

         end;

         // программада экспортталатындардың хабарламасы

         function ShowModalForm : integer;

         Procedure ShowForm (aHandle : THandle);

         Procedure FreeForm :

         var

                   DUForm : TDLLForm :

                   implementation

                   {$ R * DFM}

                   function ShowModalForm : integer;

                   // модальды шақыру.

                   begin

                   DLLForm : = TDLLForm. Create (Application) ;

                   Result = DUForm. ShowModal;

                   DUForm. Free :

                   end;

                   Procedure ShowForm (Appl. Form : THandle);

                   // модальды емес шақыру

                   begin

                   Application. Handle : =Appl:  // Application  объектісінің орнын басушы.

                   DUForm : = TDLLForm. Create (Application);

                   CalleForm : = Form;

                   DUForm  Show

                   end;

                   Procedure FreeForm :

                   // форманың жойылуы

                   begin

                   DUForm. Free

                   end;

                   Procedure TDLLForm. FormClose (Sender : TObject :

                   Var  Action : TCloseAction) ;

                   begin

                  if CallForm <  > o then

                            SendMessade (CallForm. Wm  uses. o.o)

                   end;

                   end.

 

          Динамикалы байланысатын кітапханаларды құру

         Жоғарыдағы синтаксистен көрініп тұрғандай, динамикалы байланысатын кітапханалардың құрылымдары дәл программалардың құрылымымен бірдей. Айырмашылығы ДИ-дің бөлімінде кілттік сөз  Program –-ның орнына library кілттік сөзі жазылады. Бұл сөз компиляторға EXE емес ДИ-типті динамикалы байланысатын кітапханалардың орындалатын файлын құру талап етілгендігін көрсетеді:

         library Vector;

         uses globala , crt;

 

         Procedure PrintVect (Vect : T  Vector;  N : Byte) ;

         var  i : Byte ;

         begin

                   writeln (‘вектордың элементтері : ‘);

         for  i :  = 1   to  N do   Write  (Vect [i]: 5,’    ‘) ;

         writeln;

         end;

                   Procedure  Vect Max  (Vect :  T Vector ;  N : Byte); export;

                   var  Max  :   integer;

                            i: Byte ;

                   begin

                   Max : = Vect [1];

                   for   i : = 2 to N do

                   if   vect [i] > Max  then

                            Max : = Vect [i];

                   clrscr;

                   Print Vect ( Vect, N);

                   writeln (‘вектордың максималдық элементі:’,  Max)

                   end;

                   Procedure  Vect Min  (Vect: T  Vector; N: Byte); export;

                   Var  Min: integer ;

                                      i : Byte;

                    begin

                            Min: = Vect [1];

                            for   i : = 2 to N do

                            if   vect [1] > Min  then

                            Min : = Vect [i];

                  clrscr;

                   Print Vect ( Vect, N);

                   writeln (‘вектордың максималдық элементі:’,  Min)

                   end;

 

 

                   Procedure  Vect Inverse  (Var Vect: T  Vector; N: Byte); export;

                   var  Temp: integer ;

                                      I : Byte;

                    begin

                            clrscr;

                   writeln (‘айналдырғанға дейінгі вектор:’);

                   Print Vect ( Vect, N);

                   for i : =1   to  N  div   2 do

                   begin Temp :  Vect  [i];

                            Vect [i] : = Vect [N –i + 1];

                            Vect [N –i+1]: = Temp ;

                   end;

                    writeln (‘айналдырғаннан кейінгі вектор :’);

                   Print Vect (vect, N);

                   end;

                   export

                   Vect Max   index  1,

                   Vect Min   index  2,

                   Vect Inverse   index  3,

                   begin

                   end.

         Динамикалы байланысатын кітапханалардың жазылуында негізгі роль, 3-ші бөлімде қарастырылған exports (соңында «S» әріпі бар) және дайын DLL-де құрылған экспортталушылар бөліміндегі процедуралар мен функциялар көрсетілген  exports (соңында «S» әріпі жоқ)-қа жүктеледі. Еxports мәтініндегі процедуралар мен функцияларға шақырудың ұзақ түрін қолданып және процедуралар мен функцияларға кіру және шығу кодтарын басқара отырып, оларды экспорттауға дайындайды. Бір жағынан жазылған кітапханадағы exports мәліметінде көрсетілгенше фактілі экспорт функциялар мен процедураларды шығармайды.

         Инициативті бөлімдердің операторлары модельдегідей орындалады, бірақ, программаны іске қосқанда емес, кітапхананың бірден іске қосылған кезінде ДИ-дің қай жерде екендігін анықтау қажеттілігі үшін оперативтік жадта ДИ-ге қолданылатын счетчик жұмыс істейді.

         Әр бір ДИ үшін дәл осы уақытта оны қанша программа қолданып отырғанын көрсететін Ди-дердің өз счетчиктері орнатылуда. Динамикалы байланысқан кітапхана жүктелгеннен кейін оның қолдану счетчигі нольден үлкен болғанға дейін жадта сақталып тұрады. ДИ-ге қолданылатын барлық программалар жұмысын аяқтағаннан кейін, оған қолданылатын счетчиктің мазмұны нөлге айналып кетеді де ДИ жадтан жойылады.

         Егер қандай да бір жүктелген ДИ-ді тағы бір программа қолданатын болса, оған орнатылған счетчик көрсеткіші көбейеді де инициативті бөлімдердің операторлары қайталана орындалмайды.