Жоспар
Турбо Паскаль тілінің динамикалы байланысатын кітапханалары
І Кіріспе
ІІ Негізгі бөлім
а) Динамикалы қосылатын кітапханалар.
б) Динамикалы байланысатын кітапханаларды құру.
в) ДИ-ден процедуралар мен функцияларды импорттау.
г) Статикалық және динамикалық жүктеулер
д) Динамикалы байланысатын кітапханаға форманы енгізу
программасы
ІІІ Қорытынды
Қолданылған әдебиеттер
Динамикалы байланысатын кітапханалар
Динамикалы байланысатын кітапханалар – 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 тілінде жазылған программалар мен модульдер ДИ-ден процедуралар мен функцияларды үш тәсілмен импорттай алады.
- Атауы бойынша
- Жаңа Атауы бойынша
- Ретті номері бойынша
Процедуралардың немесе функциялардың импорттаудағы фактілері оның программаларына немесе модульдеріне сай келетін жазбаларында көрсетілген Ди-ден импортталған процедуралар мен функциялар мына талаптарды қанағаттандырулары тиіс.
- Міндетті түрде External процедуралық мәліметі қолданылуы керек.
- ДИ-дің атауы External мәліметінен кейін көрсетіледі.
- Процедуралық far мәліметі арқылы немесе компилятордың {$ F +} мәліметі арқылы орнатылған модель қолданылуы керек.
Атауы бойынша импорттау процедуралар немесе функциялар жазылуында index және name мәліметтері бар болған жағдайда ғана өз атауларымен импортталады.
Мысалы:
|
Бұл жазылымда MyProc процедурасы MYLIB динамикалы байланысқан кітапханадан өз атауы бойынша, яғни MyProc деп импортталады.
Жаңа атауы бойынша импорттау.
Егер процедура немесе функция бөлімінде name мәліметі көрсетілген болса, онда ол өз атауы бойынша емес name-ге көрсетілген атау бойынша импортталады.
Мысалы:
|
Бұл жазылымда MyProc процедурасы MYLIB динамикалы байланысқан кітапханадан өз атауы бойынша Яғни, MyProc бойынша емес, жаңа бір атау NEWNAME бойынша импортталады. Бұл жаңа атау үшін кез-келген тұрақты шаманы алуға болады.
Реттік номері бойынша импорттау
Егер процедура немесе функция бөлімінде index мәліметі көрсетілген болса, онда ол өз атауы бойынша емес Іndex мәліметіне көрсетілгенмен импортталады. Мұндай импорттау модульдік жүктелу уақытын азайтады.
Мысалы:
|
Бұл жазылымда 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’):
- re : = Random;
- im : = Random;
- re : = Random;
- 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 мәліметінде көрсетілгенше фактілі экспорт функциялар мен процедураларды шығармайды.
Инициативті бөлімдердің операторлары модельдегідей орындалады, бірақ, программаны іске қосқанда емес, кітапхананың бірден іске қосылған кезінде ДИ-дің қай жерде екендігін анықтау қажеттілігі үшін оперативтік жадта ДИ-ге қолданылатын счетчик жұмыс істейді.
Әр бір ДИ үшін дәл осы уақытта оны қанша программа қолданып отырғанын көрсететін Ди-дердің өз счетчиктері орнатылуда. Динамикалы байланысқан кітапхана жүктелгеннен кейін оның қолдану счетчигі нольден үлкен болғанға дейін жадта сақталып тұрады. ДИ-ге қолданылатын барлық программалар жұмысын аяқтағаннан кейін, оған қолданылатын счетчиктің мазмұны нөлге айналып кетеді де ДИ жадтан жойылады.
Егер қандай да бір жүктелген ДИ-ді тағы бір программа қолданатын болса, оған орнатылған счетчик көрсеткіші көбейеді де инициативті бөлімдердің операторлары қайталана орындалмайды.