Delphi COM технологиялары
КІРІСПЕ
1 НЕГІЗГІ БӨЛІМ
1.1 COM . технологиясының негіздері.
1.2 Интерфейс
1.3 Интерфейстерді жариялау
1.4 Интерфейстер және VCL Tcomponent класы
1.5 COM . сервер, құрамы және қолдануы
1.6 Ағымдар мен бөлмелер
2 ПРАКТИКАЛЫҚ БӨЛІМ
2.1 COM . серверін ұйымдастыру
2.2 COM . серверін тіркеу
2.3 Интерфейстердің және параметрлердің берілуі
ҚОРЫТЫНДЫ
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
ҚОСЫМША
1 НЕГІЗГІ БӨЛІМ
1.1 COM . технологиясының негіздері.
1.2 Интерфейс
1.3 Интерфейстерді жариялау
1.4 Интерфейстер және VCL Tcomponent класы
1.5 COM . сервер, құрамы және қолдануы
1.6 Ағымдар мен бөлмелер
2 ПРАКТИКАЛЫҚ БӨЛІМ
2.1 COM . серверін ұйымдастыру
2.2 COM . серверін тіркеу
2.3 Интерфейстердің және параметрлердің берілуі
ҚОРЫТЫНДЫ
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
ҚОСЫМША
КІРІСПЕ
COM (Component Object Model – көп компонентті объектілер моделі) - Windows технологияларының ішіндегі негізгілердің бірі.COM – бұл компоненттердің объектілі моделі.COM – технологиясы API – ді суреттеу кезінде және әртүрлі программалау ортасы мен әртүрлі тілдер объектілерін үйлестіру үшін қолданылатын екілік стандартты суреттеу үшін қолданылады.СОМ компоненттер мен приложениялар арасындағы қарым – қатынас моделін ұсынады.СОМ – технологиясы СОМ – объектілермен жұмыс жасайды.Объект СОМ серверінің бөлігі болып табылады.СОМ – объекттер Delphi визуалды кітапханасының объектілеріне ұқсас.VCL Delphi объектілеріне қарағанда СОМ-объектілерінің құрамында әдістер,қасиеттер және интерфейстер болады.Жай ғана СОМ-объектінің құрамында бір немесе бірнеше интерфейс болады.Егер интерфейстер бірнеше болса, онда олардың ішінде ұқсас функцияларды орындайтын көптеген әдістер болады. Интерфейсті жариялаудың құрамына оның әдістерін және қасиеттерін суреттеу кіреді бірақ оны жүзеге асыру кірмейді.Сонымен қатар интерфейсті жариялаған кезде оналты байттық сан көрсетілуі мүмкін, ол интерфейстің идентификаторы.Әр интерфейстің өзіндік көрсеткіші болады.
СОМ – технологиясының екі ерекшелігі бар:
- СОМ – объектілерді құру программалау тіліне тәуелді емес.Осындай жолмен СОМ-объектілері кез – келген тілде жазылуы мүмкін.
- СОМ-объектілері Windows – қа арналған кез – келген программалау ортасында қолданылуы мүмкін.Осы орталардың құрамына келесілер кіреді: Delphi, Visual C++, C++Builder, Visual Basic және тағы басқалар.Microsoft фирмасы Windows операциялық жүйесін құрастырған кезде алдына қойған ең басты мақсаттарының бірі,Windows – та жұмыс істейтін әртүрлі программалардың бір – бірімен үйлесімділікте болуы.Бұл оңай емес мәселені шешудің алғашқылары алмастырулар буфері,бөлетін файлдар және мәліметтерді динамикалық алмастырулар технологиясы (Dynamic Data Exchange, DDE) болды.Осыдан кейін объектілерді енгізу және біріктіру технологиясы (Object Linking and Embedding, OLE) құрылды.Алғашқы нұсқасы OLE 1,құрамды құжаттарды құру үшін арналған.Бұл нұсқа жетілдірілмеген болып танылды.Оның орнына OLE 2 нұсқасы шығарылды.Жаңа нұсқасы әртүрлі программалардың бір – біріне өздерінің функцияларын ұсыну туралы сұрақтарды шешуге мүмкіндік берді.Бұл технология 1996 жылға дейін қолданылған.Одан кейін оның орнына ActiveX технологиясы келді.Оның құрамына автоматтандыру (OLE-автоматтандыру),контейнерлер,басқарушы элементтер,Web-технологиялар және т.б. кіреді.
COM (Component Object Model – көп компонентті объектілер моделі) - Windows технологияларының ішіндегі негізгілердің бірі.COM – бұл компоненттердің объектілі моделі.COM – технологиясы API – ді суреттеу кезінде және әртүрлі программалау ортасы мен әртүрлі тілдер объектілерін үйлестіру үшін қолданылатын екілік стандартты суреттеу үшін қолданылады.СОМ компоненттер мен приложениялар арасындағы қарым – қатынас моделін ұсынады.СОМ – технологиясы СОМ – объектілермен жұмыс жасайды.Объект СОМ серверінің бөлігі болып табылады.СОМ – объекттер Delphi визуалды кітапханасының объектілеріне ұқсас.VCL Delphi объектілеріне қарағанда СОМ-объектілерінің құрамында әдістер,қасиеттер және интерфейстер болады.Жай ғана СОМ-объектінің құрамында бір немесе бірнеше интерфейс болады.Егер интерфейстер бірнеше болса, онда олардың ішінде ұқсас функцияларды орындайтын көптеген әдістер болады. Интерфейсті жариялаудың құрамына оның әдістерін және қасиеттерін суреттеу кіреді бірақ оны жүзеге асыру кірмейді.Сонымен қатар интерфейсті жариялаған кезде оналты байттық сан көрсетілуі мүмкін, ол интерфейстің идентификаторы.Әр интерфейстің өзіндік көрсеткіші болады.
СОМ – технологиясының екі ерекшелігі бар:
- СОМ – объектілерді құру программалау тіліне тәуелді емес.Осындай жолмен СОМ-объектілері кез – келген тілде жазылуы мүмкін.
- СОМ-объектілері Windows – қа арналған кез – келген программалау ортасында қолданылуы мүмкін.Осы орталардың құрамына келесілер кіреді: Delphi, Visual C++, C++Builder, Visual Basic және тағы басқалар.Microsoft фирмасы Windows операциялық жүйесін құрастырған кезде алдына қойған ең басты мақсаттарының бірі,Windows – та жұмыс істейтін әртүрлі программалардың бір – бірімен үйлесімділікте болуы.Бұл оңай емес мәселені шешудің алғашқылары алмастырулар буфері,бөлетін файлдар және мәліметтерді динамикалық алмастырулар технологиясы (Dynamic Data Exchange, DDE) болды.Осыдан кейін объектілерді енгізу және біріктіру технологиясы (Object Linking and Embedding, OLE) құрылды.Алғашқы нұсқасы OLE 1,құрамды құжаттарды құру үшін арналған.Бұл нұсқа жетілдірілмеген болып танылды.Оның орнына OLE 2 нұсқасы шығарылды.Жаңа нұсқасы әртүрлі программалардың бір – біріне өздерінің функцияларын ұсыну туралы сұрақтарды шешуге мүмкіндік берді.Бұл технология 1996 жылға дейін қолданылған.Одан кейін оның орнына ActiveX технологиясы келді.Оның құрамына автоматтандыру (OLE-автоматтандыру),контейнерлер,басқарушы элементтер,Web-технологиялар және т.б. кіреді.
Пән: Информатика, Программалау, Мәліметтер қоры
Жұмыс түрі: Курстық жұмыс
Тегін: Антиплагиат
Көлемі: 27 бет
Таңдаулыға:
Жұмыс түрі: Курстық жұмыс
Тегін: Антиплагиат
Көлемі: 27 бет
Таңдаулыға:
Delphi COM технологиялары [31 бет]
КІРІСПЕ
1 НЕГІЗГІ БӨЛІМ
1.1 COM – технологиясының негіздері.
1.2 Интерфейс
1.3 Интерфейстерді жариялау
1.4 Интерфейстер және VCL Tcomponent класы
1.5 COM – сервер, құрамы және қолдануы
1.6 Ағымдар мен бөлмелер
2 ПРАКТИКАЛЫҚ БӨЛІМ
2.1 COM – серверін ұйымдастыру
2.2 COM - серверін тіркеу
2.3 Интерфейстердің және параметрлердің берілуі
ҚОРЫТЫНДЫ
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
ҚОСЫМША
КІРІСПЕ
COM (Component Object Model – көп компонентті объектілер моделі) -
Windows технологияларының ішіндегі негізгілердің бірі.COM – бұл
компоненттердің объектілі моделі.COM – технологиясы API – ді суреттеу
кезінде және әртүрлі программалау ортасы мен әртүрлі тілдер объектілерін
үйлестіру үшін қолданылатын екілік стандартты суреттеу үшін қолданылады.СОМ
компоненттер мен приложениялар арасындағы қарым – қатынас моделін
ұсынады.СОМ – технологиясы СОМ – объектілермен жұмыс жасайды.Объект СОМ
серверінің бөлігі болып табылады.СОМ – объекттер Delphi визуалды
кітапханасының объектілеріне ұқсас.VCL Delphi объектілеріне қарағанда СОМ-
объектілерінің құрамында әдістер,қасиеттер және интерфейстер болады.Жай
ғана СОМ-объектінің құрамында бір немесе бірнеше интерфейс болады.Егер
интерфейстер бірнеше болса, онда олардың ішінде ұқсас функцияларды
орындайтын көптеген әдістер болады. Интерфейсті жариялаудың құрамына оның
әдістерін және қасиеттерін суреттеу кіреді бірақ оны жүзеге асыру
кірмейді.Сонымен қатар интерфейсті жариялаған кезде оналты байттық сан
көрсетілуі мүмкін, ол интерфейстің идентификаторы.Әр интерфейстің өзіндік
көрсеткіші болады.
СОМ – технологиясының екі ерекшелігі бар:
- СОМ – объектілерді құру программалау тіліне тәуелді емес.Осындай
жолмен СОМ-объектілері кез – келген тілде жазылуы мүмкін.
- СОМ-объектілері Windows – қа арналған кез – келген программалау
ортасында қолданылуы мүмкін.Осы орталардың құрамына келесілер кіреді:
Delphi, Visual C++, C++Builder, Visual Basic және тағы басқалар.Microsoft
фирмасы Windows операциялық жүйесін құрастырған кезде алдына қойған ең
басты мақсаттарының бірі,Windows – та жұмыс істейтін әртүрлі
программалардың бір – бірімен үйлесімділікте болуы.Бұл оңай емес мәселені
шешудің алғашқылары алмастырулар буфері,бөлетін файлдар және мәліметтерді
динамикалық алмастырулар технологиясы (Dynamic Data Exchange, DDE)
болды.Осыдан кейін объектілерді енгізу және біріктіру технологиясы (Object
Linking and Embedding, OLE) құрылды.Алғашқы нұсқасы OLE 1,құрамды
құжаттарды құру үшін арналған.Бұл нұсқа жетілдірілмеген болып танылды.Оның
орнына OLE 2 нұсқасы шығарылды.Жаңа нұсқасы әртүрлі программалардың бір –
біріне өздерінің функцияларын ұсыну туралы сұрақтарды шешуге мүмкіндік
берді.Бұл технология 1996 жылға дейін қолданылған.Одан кейін оның орнына
ActiveX технологиясы келді.Оның құрамына автоматтандыру (OLE-
автоматтандыру),контейнерлер,басқар ушы элементтер,Web-технологиялар және
т.б. кіреді.
1 НЕГІЗГІ БӨЛІМ
1.1 COM – технологиясының негіздері.
COM технологиясы бір программаға (клиент) басқа программаның (сервер)
объектісімен жұмыс істеуге мүмкіндік береді.СОМ бұл әртүрлі компаниялармен
әртүрлі тілде жазылған компоненттердің өзара түсіністікте және алмасуда
болуын қарастыратын объект жобасы.Программалардың қай жақта орындалып
жатқаны маңызды рол атқарады:бір потокта, әртүрлі потоктарда, әртүрлі
компьютерлерде.Қазіргі кезде шығып жатқан Windows – тың соңғы
технологиялары (Shell, Scripting, HTML қолдау және т.б.) өздерінің
қабықшалы программалық интерфейстерін (Application Program Inyerface, API)
COM интерфейсі арқылы жүзеге асырады.Сондықтан, қазіргі заманда
профессионалды программалау COM моделін түсінуді және онымен жұмыс істеуді
талап етеді. Delphi – дің басты ерекшеліктерінің бірі СОМ – технологиясын
қолдауы болып табылады.
СОМ – ның көзқарасы бойынша приложенияның құрамында бірнеше объект
болады(кейбір жағдайда бір ғана объект болуы мүмкін).Әр объекттің бір
немесе бірнеше интерфейсі болуы мүмкін.Интерфейсте сыртқы программалар
рұқсат алатын объекттің әдістері сипатталған.Егер интерфейстер бірнеше
болса, онда олардың ішінде ұқсас функцияларды орындайтын көптеген әдістер
болады. Объект СОМ серверінің бөлігі болып табылады.COM технологиясының
негізгі мақсаты – объекттердің экспорттану мүмкіндіктерін қамтамасыз ету
болып табылады.Объекттердің экспорттану ойы келесіде:бір модуль объект
құрады, ал екінші модуль әдістер мен сервистерге сұраныс жасау арқылы ол
объектті қолданады. Сервер орындаушы файл немесе DLL библиотекасы болуы
мүмкін. Windows – та сервер орнатылғанда жүйелік реестерге оның барлық
объектілері туралы мәліметтер енгізіледі.Бұл мәліметтердің құрамына
объекттің класын анықтайтын CLSID (Class Identifier) класының
идентификаторы кіреді.Сервердің типі жайлы мәліметтер енгізіледі: клиентке
қосылатын (in-process) — DLL ішкі, клиенттің компьютерінде бөлек процесс
болып жұмыс істейтін — локальды (local), өшірілген компьютерде жұмыс
істейтін — (remote) өшірілген.Ішкі және локальды серверлер үшін реестерге
файлдың толық аты енгізіледі, ал өшірілген үшін толық желілік мекен жай
енгізіледі.Осындай жолмен кез-келген кезде шақыруға болатын СОМ сервері
жайлы ақпараттар жүйеде сақталып тұрады.Енді жай ғана мысал келтірейік:
Бізде класс бар – примитивті калькулятор:
MyCalc=class
fx,fy:integer;
public:
procedure SetOperands(x,y:integer)
function Sum:integer;
function Diff:integer;
end;
procedure MyCalc.SetOperands(x,y:integer)
begin
fx:=x; fy:=y;
end;
function MyCalc.Sum:integer;
begin
result:=fx+fy;
end;
function MyCalc.Diff:integer;
begin
result:=fx-fy;
end;
Енді бізде осы кластың элементі болса, онда оны қолдану түкке
тұрмайды.Енді келесі жағдайды келтірейік:осы кластың объектісі аталынатын
бір модуль бар.Мысалы:
unit MyCalc
type
MyCalc=class
суреттелуі жоғарыда
var
Calc:MyCalc;
Енді біз оны қайтадан компиляция жасамай - ақ басқа модульде
қолданғымыз келеді.Ең оңай нұсқасы келесідей болады:
unit MyCalc
type
MyCalc=class
сипатталуы жоғарыда
var Calc:MyCalc;
procedure SetOperands(x,y:integer)
begin
Calc.SetOperands(x,y);
end;
function Sum:integer;
begin
result:= Calc.Sum;
end;
function Diff:integer;
begin
result:= Calс.Diff;
end;
procedure CreateObject;
begin
Calc:=MyCalc.Create;
end;
procedure ReleaseObject;
begin
Calc.Free;
end;
1.2 Интерфейс
Енді интерфейсті толығырақ қарастырайық.Интерфейс программист пен
компилятор арасындағы келісім шарт болып табылады.Программист интерфейсте
суреттелген бүкіл әдістерді жүзеге асыруға міндетті.Компилятор жасалынып
жатқан интерфейстің әдістеріне сұраныс жасауға мүмкіндік беретін
программаның ішіндегі ішкі структураларды іске асыруға міндетті.Осындай
жолмен COM технологиясы тілдік – тәуелсіз болып табылады және былайша
айтқанда оны программаларды біріктіретін клей түрінде қолдануға болады. СОМ
объектісіне сұраныс жасап тұрған сыртқы приложениялар СОМ клиенттері болып
табылады.Клиент сұраныс жасап тұрған объектінің интерфейсіне сілтеме
алады.Осы сілтеме арқылы объектінің әдістерін шақыра алады. СОМ спецификасы
бұрын аталған интерфейсті өзгертуге тыйым салады.Бұл серверде әртүрлі
модификациялар пайда болған кезде клиенттің жұмысының дұрыстығын қамтамасыз
етеді.
Осындай жолмен клиентке объектінің интерфейсін және ол ұсынып тұрған
әдістерді білгені ақ жеткілікті.Ал басқа жақтарын жүйе қамтамасыз
етеді.Егер сервер қосылмаған болса, онда жүйе оны керек кезде қосады.Сервер
объект құрады, объект бүкіл мәліметтерді жүкейді және клиент жұмыс істей
алу клиентке объектіге және оның интерфейсіне сілтеме береді.Жүйе
объектінің бірден бірнеше клиенттермен жұмыс істеуін қамтамасыз етеді.Ол
үшін жүйе объектіге жасалған сілтемелер санының есебін жүргізеді.Клиентке
белгілі бір интерфейске көрсеткіш жіберілгенде сілтемелер саны бірге
көбейеді.Ал клиенттің объектімен жұмысы аяқталған кезде сілтемелер саны
бірге азаяды.Егер сілтемелер саны нөлге тең болса, онда жүйе сол кездегі
бірде бір клиент жұмыс істемей тұрған объектіні жояды.Барлығы жақсы, бірақ
клиенттік приложенияны өндіруші СОМ объектілері, интерфнйстері, әдістері,
қасиеттері туралы мәліметтерді қайдан алады?Бүкіл керекті мәліметтер типтер
кітапханасында орналасқан.Оны СОМ объектісінің өндірушісі құрастырады және
объектімен бірге таралады.Кітапхана интерфейсті суреттеу тілі IDL
(Interface Definition Language) арқылы құрастырылады.
Интерфейсті жариялаудың құрамына оның әдістерін және қасиеттерін
суреттеу кіреді бірақ оны жүзеге асыру кірмейді.Сонымен қатар интерфейсті
жариялаған кезде оналты байттық сан көрсетілуі мүмкін, ол интерфейстің
идентификаторы. Кез келген идентификатордың құрамында I символынан
басталатын аты және GUID (Globally Unique Identifier) глобальды
идентификатор болады.GUID тек қана идентификаторлар үшін ғана жасалып
қолданылмайды.Интерфейстер үшін GUID IID деп аталады.Кез келген СОМ
объектісінде Іunknown интерфейсі болады.Бұл интерфейстің тек қана үш әдісі
бар: Query Interface — интерфейске көрсеткіш алу, AddRef и Release —
объектіге сілтемелер санының бірге көбеюі және кішіреюі. Delphi да
интерфейс әдістерінің сәйкес аттары кішкене өзгеше: Querylnterface, AddRef,
Release.
Интерфейстер мұрагерлене алады.Интерфейстің мұрагерленуі бұл –
мұрагерлік интерфейстің құрамына алдыңғы интерфейстердің бүкіл әдістерінің
кіруін көрсететін декларация.Бірақ келесілерді түсіну керек:
Интерфейс - бұл класс емес.Класс интерфейстің іске асырылуы болып
табылады.Бірақ кластың құрамында белгілі бір программалау тіліндегі
әдістердің кодтары болады, ал интерфейте болмайды.
Интерфейс - қатаң түрде типтелген.Клиентте интерфейстің жүзеге
асырылуы да интерфейсте суреттелген әдістер мен қасиеттерді қолдануы керек.
1.3 Интерфейстерді жариялау
Интерфейстерді қолдау үшін Delphi Pascal тілінің синтаксисін қосымша
кілттік сөздермен кеңейтеді.Delphi – де интерфейсті жариялау interface
кілттік сөзі арқылы жүзеге асады.Мысалы:
type
IMyInterface = interface
['{412AFF00-5C21-11D4-84DD-C8393F76 3A13}']
procedure DoSomething(var I: Integer); stdcall;
function DoSomethingAnother(S: String): Boolean;
end;
IMyInterface2 = interface(IMyInterface)
['{412AFF01-5C21-11D4-84DD-C8393F76 3A13}']
procedure DoAdditional(var I: Integer); stdcall;
end;
Delphi – да GUID жаңа мағынасының генерациясын IDE – ге ауыстыру үшін
Ctrl+Shift+G батырмаларының бірігуін басу керек.
COM моделінің негізгі интерфейсі Iunknown болып табылады.Кез – келген
интерфейс Iunknown интерфейсінен мұрагерленеді және бұрын жарияланған
әдістерді міндетті түрде іске асыру керек. Iunknown интерфейсі System.pas
модулінде келесі түрде жарияланады:
type
IUnknown = interface
['{00000000-0000-0000-C000-00000000 0046}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
Iunknown әдісінің не үшін арналғанын қарастырайық.Соңғы екі әдіс
сілтемелерді санау механизмін жүзеге асыру үшін қажет.
function _AddRef: Integer; stdcall;
Бұл функция интерфейске жасалған сілтемелердің санын бірге көбейтеді
және есептегіштің жаңа мағынасын қайтарады.
function _Release: Integer; stdcall;
Бұл функция интерфейске жасалынған сілтемелердің санын бірге
азайтады.Жоғарыда айтылғандай егер сілтемелер саны нөлге тең болса, онда
жүйе сол кездегі бірде бір клиент жұмыс істемей тұрған объектіні жояды.
Бірінші әдіс интерфейсті іске асырып жатқан класқа сілтеме алуға
мүмкіндік береді.
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
Бұл функция кіру қасиеті ретінде интерфейстің идентификаторын
алады.Егер объект сұраныс жасалған интерфейсті іске асыратын болса, онда
функция:
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. Нолді қайтарады.
Болмаған жағдайда функция қателік кодын E_NOINTERFACE қайтарады.
System.pas модулінде Iunknown – ды және оның әдістерін жүзеге асыратын
TinterfacedObject класы жарияланған.Өз интерфейсіңді құру үшін осы класты
қолдану тиімді болады.Одан басқа Tobject класында интерфейстерді жүзеге
асырудың қолдауы бар.Оның келесі әдісі бар:
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
Егер объект сұраныс жасалған интерфейсті іске асыратын болса, онда
функция:
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. TRUE - ні қайтарады
Болмаған жағдайда функция FALSE – ты қайтарады.Осындай жолмен Delphi –
дің кез келген класынан оның жүзеге асыратын интерфейсіне сұраныс жасауға
болады. Delphi – де интерфейсті іске асыру үшін міндңтті түрде класс
қолданылады.Ол үшін класты жариялау кезінде оның қандай интерфейстерді
жүзеге асыратынын көрсету керек.
type
TMyClass = class(TComponent, IMyInterface, IDropTarget)
Әдістерді іске асыру
end;
TmyClass класы IMyInterface және IdropTarget интерфейстерін жүзеге
асырады.Бұл жерде кластың бірнеше интерфейстерді жүзеге асыруы мұрагерлік
жолмен берілмегендігін түсіну өте маңызды.Кластарды суреттеу кезінде
көрсетілетін интерфейстер тек сол класс арқылы жүзеге асырылатын
интерфейстер бар екендігін көрсетеді.Интерфейсте жарияланған бүкіл
әдістердің аттары мен тізімдері, қасиеттері класта қолданылатын әдістерге
сәйкес келуі керек.Мысал келтірейік:
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
TTest = class(TInterfacedObject, ITest)
procedure Beep;
destructor Destroy; override;
end;
...
procedure TTest.Beep;
begin
Windows.Beep(0,0);
end;
destructor TTest.Destroy;
begin
inherited;
MessageBox(0, 'TTest.Destroy', NIL, 0);
end;
Бұл жерде Ttest класы Itest интерфейсін жүзеге асырады.Программадан
интерфейсті қолдануды қарастырайық.
procedure TForm1.Button1Click(Sender: TObject);
var
Test: ITest;
begin
Test := TTest.Create;
Test.Beep;
end;
Егер біз интерфейстің жүзеге асырылуын бірден жойғымыз келсе, онда
ауыспалының көзге көрінбейтін аймаққа шықпай тұрған кезде оған NIL
мағынасын меншіктеу керек.
Code:
var
Test: ITest;
T: TTest;
begin
T := TTest.Create;
Test := T;
Test.Beep;
Test := NIL; IUnknown._Release автоматты түрде шақырылады;
end;
Iunknown әдісінің автоматты түрде шақырылуына көңіл бөлу
керек.Сондықтан Iunknown әдісін өзіміз шақырмау керекпіз.Бұл автоматты
түрде сілтемелерді санаудың дұрыс жұмыс істеуіне кедергі келтіреді.Оны
болдырмау үшін келесілерді есте сақтау керек:
- интерфейске объекттің типін келтірген кезде _AddRef әдісі
шақырылады.
- интерфейске сұраныс жасап тұрған ауыспалыға басқа мағына меншіктеген
кезде _Release әдісі шақырылады.
Бір рет объекттен интерфейске сұраныс жасағаннан кейін, болашақта
объектті өз қолымызбен босатпау керекпіз.Осы уаққытан бастап объектпен тек
қана интерфейстік сілтемелер арқылы жұмыс істеу керек.Қарастырылған
мысалдарда интерфейсті алу үшін кластардағы қолданылған кодтар компиляция
кезеңінде өзгеріп отырды.Егер класс сұраныс жасап тұрған интерфейсті жүзеге
асырмаса онда программа компиляциядан өтпейді.Бірақ программаны орындау
кезінде интерфейске сұраныс жасауға мүмкіндік бар.Ол үшін as операторы
қолданылады.Ол QueryInterface – ті шақырады және сәттілік болған жағдайда
қабылданған интерфейске сілтемені қайтарады.Мысалы келесі код компиляциядан
өтеді, бірақ орындау кезінде келесі қатені шығарады Interface not
supported:
var
Test: ITest;
begin
Test := TInterfacedObject.Create as ITest;
Test.Beep;
end;
Сол уақытта да код:
var
Test: ITest;
begin
Test := TTest.Create as ITest;
Test.Beep;
end;
Компиляциядан өтеді және орындалады.
Енді интерфейстерді жүзеге асыруды толығырақ қарастырайық.
Екі интерфейсті жариялайық:
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
ITest2 = interface
['{61F26D42-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
Енді осы екі интерфейсті де жүзеге асыратын класты құрайық:
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure Beep1;
procedure Beep2;
procedure ITest.Beep = Beep1;
procedure ITest2.Beep = Beep2;
end;
Көрініп тұрғандай кластың құрамында бірден екі Beep әдіс болуы мүмкін
емес.Сондықтан Delphi осындай аттарға байланысты конфликттарды шешуге
амалдарды ұсынады.Ол кластың қай әдісі интерфейсті жүзеге асырудың әдісімен
сәйкес келетіндігін анықтайды және көрсетеді.Егер TTest2.Beep1 и
TTest2.Beep2 әдістері ұқсас болса, онда екі әртүрлі әдістерді құрастырмай
ақ, класты келесі түрде жариялау керек:
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure MyBeep;
procedure ITest.Beep = MyBeep;
procedure ITest2.Beep = MyBeep;
end;
Екі интерфейсті жүзеге асыратын кластың мысалын қарастырайық:
type
TBeeper = class
procedure Beep;
end;
TMessager = class
procedure ShowMessage(const S: String);
end;
TTest3 = class(TInterfacedObject, ITest, IAnotherTest)
private
FBeeper: TBeeper;
FMessager: TMessager;
property Beeper: TBeeper read FBeeper implements ITest;
property Messager: TMessager read FMessager implements IAnotherTest;
public
constructor Create;
destructor Destroy; override;
end;
Интерфейстің жүзеге асырылуын басқа класқа жүктеу үшін implements
кілттік сөзі қолданылады:
{ TBeeper }
procedure TBeeper.Beep;
begin
Windows.Beep(0,0);
end;
{ TMessager }
procedure TMessager.ShowMessage(const S: String);
begin
MessageBox(0, PChar(S), NIL, 0);
end;
{ TTest3 }
constructor TTest3.Create;
begin
inherited;
FBeeper := TBeeper.Create;
FMessager := TMessager.Create;
end;
destructor TTest3.Destroy;
begin
Кластарды босату
FBeeper.Free;
FMessager.Free;
inherited;
end;
1.4 Интерфейстер және VCL Tcomponent класы
VCL Tcomponent базалық класында Iunknown интерфейсін жүзеге асыруға
мүмкіндік беретін көптеген әдістер жиынтығы бар.Бірақ кластың өзі бұл
интерфейсті жүзеге асырады.Бұл Tcomponent мұрагерлеріне Iunknown
интерфейсін жүзеге асыруды алаңдамай басқа интерфейстерді жүзеге асыруға
мүмкіндік береді.Бірақ Tcomponent _AddRef және TComponent._Release
әдістері программаны орындау кезеңдерінде сілтемелерді санау механизмін
жүзеге асырмайды.Сол себепті интерфейсті жүзеге асырушы Tcomponent
мұрагерлері үшін жадыны басқарудың автоматты түрі жұмыс істемейді.Бұл
жағдай жадыда уақытша орналасқан объектілерге қорқпай сұраныс жасалына
береді, себебі олар жадыдан өшіріліп кетпейді.Сонымен келесі код дұрыс және
қауіпсіз болып тпбылады:
type
IGetData = interface
['{B5266AE0-5E77-11D4-84DD-9153115A BFC3}']
function GetData: String;
end;
TForm1 = class(TForm, IGetData)
private
function GetData: String;
end;
...
var
I: Integer;
GD: IGetData;
S: String;
begin
S := '';
for I := 0 to Pred(Screen.FormCount) do begin
if Screen.Forms[I].GetInterface(IGetDa ta, GD) then
S := S + GD.GetData + #13;
end;
ShowMessage(S);
end;
Бұл код приложенияларындағы бүкіл формалардың ішінде IgetData
интерфейсін жүзеге асыру барының немесе жоқтығын тексереді.Егер форма бұл
интерфейсті жүзеге асыратын болса, онда оның әдісін шақырады.
Жоғарыда қаралған Tcomponent приложениядағы компоненттерді қатаң
типтілікті жоғалтпай біріктіруді және оңай соғуға мүмкіндік
береді.Компонентті жүзеге асыру ғана жеткілікті, ал шақырылған программада
оның бар немесе жоқтығын тексеру керек.
Мысалы біркелкі құралдар панелі және көптеген әртүрлі формалары бар
MDI приложенияны қарастырайық.Бұл құралдар панелінде Сақтау, Жүктеу
және Тазалау командалары бар, бірақ терезелердің әрқайсысы бұл
командаларға әртүрлі жауап береді.Интерфейстерді жариялау модулін жасайық:
unit ToolbarInterface;
interface
type
TCommandType = (ctSave, ctLoad, ctClear);
TCommandTypes = set of TCommandType;
TSaveType = (stSave, stSaveAS);
IToolBarCommands = interface
['{B5266AE1-5E77-11D4-84DD-9153115A BFC3}']
function SupportedCommands: TCommandTypes;
function Save(AType: TSaveType): Boolean;
procedure Load;
procedure Clear;
end;
implementation
end.
1- суретте. Программаның жұмысы
1.5 COM – сервер, құрамы және қолдануы
COM моделі программалау тілдерінен тәуелсіз көп рет қолдануға болатын
компоненттерді құруға мүмкіндік береді.Бұл компоненттерді COM серверлер
деп атайды.Олар орындаушы (EXE) файлдарынан және динамикалық (DLL)
кітапханаларынан тұрады.Егер олар COM – ды қолдайтын программалу тілінде
жазылған болса, онда оларды еш қиындықсыз кез – келген программадан
шақыруға болады.COM сервер (In-Proc сервер) шақырушы программаның адрестік
аймағында,(Out-Of-Proc сервер) өзіндік процесі ретінде немесе басқа
(Distributed COM) компьютерде орындала алады.COM берілгендерді
жіберуге(Marshalling) байланысты және клиент пен сервердің арасындағы
потоктік үйлесімділікке байланысты сұрақтарды автоматты түрде шешеді.
COMмен жұмыс істеу үшін керекті архитектуралық мәліметтер:
COM сервер – бұл арнайы түрде безендірілген және тіркелген
приложение.Ол клиенттерге өздері жүзеге асырған объектілерге сұраныс
жасауға мүмкіндік береді.Сервер динамикалық кітапхана ретінде немесе
орындалушы файл ретінде жасалынуы мүмкін.
DLL түріндегі сервер.
Бұл сервер әрқашанда оны жүзеге асырған (In-Process) приложенияның
адрестік аймағында орындалады.Осының әсерінен сервер әдістеріне жасалған
шақырулардың шығыны төмендейді.Бұл сервер қауіпсіз болып табылмайды.Себебі
оның жадысы шақырылған приложениялардағы қателіктерден сақтанбаған.Сонымен
қатар ол өшірілген компьютерде орындала алмайды, өйткені ол жерде DLL
жүктелген процесс жоқ.Мысалы ретінде Microsoft Transaction Server модулін
көрсетуге болады.
Орындалушы файл ретіндегі сервер.
Бұл сервер басқа приложениялардың сұранысы бойынша COM объектілерін
құруға мүмкіндік беретін Windows орындалушы файлы болып табылады.Мысалы
ретінде Microsoft Office пакетін келтіруге болады.Оның приложениялары COM –
серверлар болып табылады.
1.6 Ағымдар мен бөлмелер
Windows – көптапсырмалы және көпағымды орта.COM – ға қатысты бұл
келесілерді білдіреді:
- клиент пен сервер приложенияның әртүрлі ағымдарында немесе
процестерінде болуы мүмкін;
- серверге бір уақытта бірнеше клиент сұраныс жасаса болады.COM
технологиясы бұл мәселені COM клиенттері мен серверлері
орындалатын бөлмелер концепциясы (Apartments) арқылы
шешеді.Бөлмелер бірағымды (Single Threaded Apartment, STA)
және көпағымдыі (Multiple Threaded Apartment, MTA) болады.
STA
Бірағымды бөлмені құрған кезде COM терезе құрады.COM – серверінің кез-
келген әдістерінің бірін шақырған кезде сол бөлмедегі терезеге PostMessage
арқылы хабарлама жіберіледі.Осындай жолмен шақырылған әдістер тізімі
құрылады және әрқайсысы алдыңғысы өңделгеннен кейін өңделеді.Бірағымды
бөлмелердің негізгі ерекшеліктері:
1.Программист әдістердің синхрондалуы туралы алаңдамаса
болады.Ағымдағы әдістің аяқталғанынша объектінің ешқандай басқа объектісі
шақырылмайды.
2.Программист класс өрістерінің рұқсатының синхрондалуы туралы
алаңдамаса болады.Себебі бір уақытта тек қана бір ғана әдіс орындалуы
мүмкін – бір уақытта өріске екі әдіспен рұқсат алу мүмкін емес.
STA – ның кемшіліктері:
1.Әдістерді шақырған кездегі синхрондалуға кететін қосымша шығындар.
2.Алдыңғы әдіс өңделіп бітпегенше келесі әдістің өңделуі мүмкін
емес.Мысалы бір минуттық әдіс орындалып бітпегенше COM объектті қолдануға
болмайды.Дегенімен COM – объектісін жүзеге асырудың ең тиімді жолы STA
болып табылады.MTA – ны қолданудың тек бір мағынасы бар, егер STA белгілі
бір ... жалғасы
КІРІСПЕ
1 НЕГІЗГІ БӨЛІМ
1.1 COM – технологиясының негіздері.
1.2 Интерфейс
1.3 Интерфейстерді жариялау
1.4 Интерфейстер және VCL Tcomponent класы
1.5 COM – сервер, құрамы және қолдануы
1.6 Ағымдар мен бөлмелер
2 ПРАКТИКАЛЫҚ БӨЛІМ
2.1 COM – серверін ұйымдастыру
2.2 COM - серверін тіркеу
2.3 Интерфейстердің және параметрлердің берілуі
ҚОРЫТЫНДЫ
ПАЙДАЛАНЫЛҒАН ӘДЕБИЕТТЕР
ҚОСЫМША
КІРІСПЕ
COM (Component Object Model – көп компонентті объектілер моделі) -
Windows технологияларының ішіндегі негізгілердің бірі.COM – бұл
компоненттердің объектілі моделі.COM – технологиясы API – ді суреттеу
кезінде және әртүрлі программалау ортасы мен әртүрлі тілдер объектілерін
үйлестіру үшін қолданылатын екілік стандартты суреттеу үшін қолданылады.СОМ
компоненттер мен приложениялар арасындағы қарым – қатынас моделін
ұсынады.СОМ – технологиясы СОМ – объектілермен жұмыс жасайды.Объект СОМ
серверінің бөлігі болып табылады.СОМ – объекттер Delphi визуалды
кітапханасының объектілеріне ұқсас.VCL Delphi объектілеріне қарағанда СОМ-
объектілерінің құрамында әдістер,қасиеттер және интерфейстер болады.Жай
ғана СОМ-объектінің құрамында бір немесе бірнеше интерфейс болады.Егер
интерфейстер бірнеше болса, онда олардың ішінде ұқсас функцияларды
орындайтын көптеген әдістер болады. Интерфейсті жариялаудың құрамына оның
әдістерін және қасиеттерін суреттеу кіреді бірақ оны жүзеге асыру
кірмейді.Сонымен қатар интерфейсті жариялаған кезде оналты байттық сан
көрсетілуі мүмкін, ол интерфейстің идентификаторы.Әр интерфейстің өзіндік
көрсеткіші болады.
СОМ – технологиясының екі ерекшелігі бар:
- СОМ – объектілерді құру программалау тіліне тәуелді емес.Осындай
жолмен СОМ-объектілері кез – келген тілде жазылуы мүмкін.
- СОМ-объектілері Windows – қа арналған кез – келген программалау
ортасында қолданылуы мүмкін.Осы орталардың құрамына келесілер кіреді:
Delphi, Visual C++, C++Builder, Visual Basic және тағы басқалар.Microsoft
фирмасы Windows операциялық жүйесін құрастырған кезде алдына қойған ең
басты мақсаттарының бірі,Windows – та жұмыс істейтін әртүрлі
программалардың бір – бірімен үйлесімділікте болуы.Бұл оңай емес мәселені
шешудің алғашқылары алмастырулар буфері,бөлетін файлдар және мәліметтерді
динамикалық алмастырулар технологиясы (Dynamic Data Exchange, DDE)
болды.Осыдан кейін объектілерді енгізу және біріктіру технологиясы (Object
Linking and Embedding, OLE) құрылды.Алғашқы нұсқасы OLE 1,құрамды
құжаттарды құру үшін арналған.Бұл нұсқа жетілдірілмеген болып танылды.Оның
орнына OLE 2 нұсқасы шығарылды.Жаңа нұсқасы әртүрлі программалардың бір –
біріне өздерінің функцияларын ұсыну туралы сұрақтарды шешуге мүмкіндік
берді.Бұл технология 1996 жылға дейін қолданылған.Одан кейін оның орнына
ActiveX технологиясы келді.Оның құрамына автоматтандыру (OLE-
автоматтандыру),контейнерлер,басқар ушы элементтер,Web-технологиялар және
т.б. кіреді.
1 НЕГІЗГІ БӨЛІМ
1.1 COM – технологиясының негіздері.
COM технологиясы бір программаға (клиент) басқа программаның (сервер)
объектісімен жұмыс істеуге мүмкіндік береді.СОМ бұл әртүрлі компаниялармен
әртүрлі тілде жазылған компоненттердің өзара түсіністікте және алмасуда
болуын қарастыратын объект жобасы.Программалардың қай жақта орындалып
жатқаны маңызды рол атқарады:бір потокта, әртүрлі потоктарда, әртүрлі
компьютерлерде.Қазіргі кезде шығып жатқан Windows – тың соңғы
технологиялары (Shell, Scripting, HTML қолдау және т.б.) өздерінің
қабықшалы программалық интерфейстерін (Application Program Inyerface, API)
COM интерфейсі арқылы жүзеге асырады.Сондықтан, қазіргі заманда
профессионалды программалау COM моделін түсінуді және онымен жұмыс істеуді
талап етеді. Delphi – дің басты ерекшеліктерінің бірі СОМ – технологиясын
қолдауы болып табылады.
СОМ – ның көзқарасы бойынша приложенияның құрамында бірнеше объект
болады(кейбір жағдайда бір ғана объект болуы мүмкін).Әр объекттің бір
немесе бірнеше интерфейсі болуы мүмкін.Интерфейсте сыртқы программалар
рұқсат алатын объекттің әдістері сипатталған.Егер интерфейстер бірнеше
болса, онда олардың ішінде ұқсас функцияларды орындайтын көптеген әдістер
болады. Объект СОМ серверінің бөлігі болып табылады.COM технологиясының
негізгі мақсаты – объекттердің экспорттану мүмкіндіктерін қамтамасыз ету
болып табылады.Объекттердің экспорттану ойы келесіде:бір модуль объект
құрады, ал екінші модуль әдістер мен сервистерге сұраныс жасау арқылы ол
объектті қолданады. Сервер орындаушы файл немесе DLL библиотекасы болуы
мүмкін. Windows – та сервер орнатылғанда жүйелік реестерге оның барлық
объектілері туралы мәліметтер енгізіледі.Бұл мәліметтердің құрамына
объекттің класын анықтайтын CLSID (Class Identifier) класының
идентификаторы кіреді.Сервердің типі жайлы мәліметтер енгізіледі: клиентке
қосылатын (in-process) — DLL ішкі, клиенттің компьютерінде бөлек процесс
болып жұмыс істейтін — локальды (local), өшірілген компьютерде жұмыс
істейтін — (remote) өшірілген.Ішкі және локальды серверлер үшін реестерге
файлдың толық аты енгізіледі, ал өшірілген үшін толық желілік мекен жай
енгізіледі.Осындай жолмен кез-келген кезде шақыруға болатын СОМ сервері
жайлы ақпараттар жүйеде сақталып тұрады.Енді жай ғана мысал келтірейік:
Бізде класс бар – примитивті калькулятор:
MyCalc=class
fx,fy:integer;
public:
procedure SetOperands(x,y:integer)
function Sum:integer;
function Diff:integer;
end;
procedure MyCalc.SetOperands(x,y:integer)
begin
fx:=x; fy:=y;
end;
function MyCalc.Sum:integer;
begin
result:=fx+fy;
end;
function MyCalc.Diff:integer;
begin
result:=fx-fy;
end;
Енді бізде осы кластың элементі болса, онда оны қолдану түкке
тұрмайды.Енді келесі жағдайды келтірейік:осы кластың объектісі аталынатын
бір модуль бар.Мысалы:
unit MyCalc
type
MyCalc=class
суреттелуі жоғарыда
var
Calc:MyCalc;
Енді біз оны қайтадан компиляция жасамай - ақ басқа модульде
қолданғымыз келеді.Ең оңай нұсқасы келесідей болады:
unit MyCalc
type
MyCalc=class
сипатталуы жоғарыда
var Calc:MyCalc;
procedure SetOperands(x,y:integer)
begin
Calc.SetOperands(x,y);
end;
function Sum:integer;
begin
result:= Calc.Sum;
end;
function Diff:integer;
begin
result:= Calс.Diff;
end;
procedure CreateObject;
begin
Calc:=MyCalc.Create;
end;
procedure ReleaseObject;
begin
Calc.Free;
end;
1.2 Интерфейс
Енді интерфейсті толығырақ қарастырайық.Интерфейс программист пен
компилятор арасындағы келісім шарт болып табылады.Программист интерфейсте
суреттелген бүкіл әдістерді жүзеге асыруға міндетті.Компилятор жасалынып
жатқан интерфейстің әдістеріне сұраныс жасауға мүмкіндік беретін
программаның ішіндегі ішкі структураларды іске асыруға міндетті.Осындай
жолмен COM технологиясы тілдік – тәуелсіз болып табылады және былайша
айтқанда оны программаларды біріктіретін клей түрінде қолдануға болады. СОМ
объектісіне сұраныс жасап тұрған сыртқы приложениялар СОМ клиенттері болып
табылады.Клиент сұраныс жасап тұрған объектінің интерфейсіне сілтеме
алады.Осы сілтеме арқылы объектінің әдістерін шақыра алады. СОМ спецификасы
бұрын аталған интерфейсті өзгертуге тыйым салады.Бұл серверде әртүрлі
модификациялар пайда болған кезде клиенттің жұмысының дұрыстығын қамтамасыз
етеді.
Осындай жолмен клиентке объектінің интерфейсін және ол ұсынып тұрған
әдістерді білгені ақ жеткілікті.Ал басқа жақтарын жүйе қамтамасыз
етеді.Егер сервер қосылмаған болса, онда жүйе оны керек кезде қосады.Сервер
объект құрады, объект бүкіл мәліметтерді жүкейді және клиент жұмыс істей
алу клиентке объектіге және оның интерфейсіне сілтеме береді.Жүйе
объектінің бірден бірнеше клиенттермен жұмыс істеуін қамтамасыз етеді.Ол
үшін жүйе объектіге жасалған сілтемелер санының есебін жүргізеді.Клиентке
белгілі бір интерфейске көрсеткіш жіберілгенде сілтемелер саны бірге
көбейеді.Ал клиенттің объектімен жұмысы аяқталған кезде сілтемелер саны
бірге азаяды.Егер сілтемелер саны нөлге тең болса, онда жүйе сол кездегі
бірде бір клиент жұмыс істемей тұрған объектіні жояды.Барлығы жақсы, бірақ
клиенттік приложенияны өндіруші СОМ объектілері, интерфнйстері, әдістері,
қасиеттері туралы мәліметтерді қайдан алады?Бүкіл керекті мәліметтер типтер
кітапханасында орналасқан.Оны СОМ объектісінің өндірушісі құрастырады және
объектімен бірге таралады.Кітапхана интерфейсті суреттеу тілі IDL
(Interface Definition Language) арқылы құрастырылады.
Интерфейсті жариялаудың құрамына оның әдістерін және қасиеттерін
суреттеу кіреді бірақ оны жүзеге асыру кірмейді.Сонымен қатар интерфейсті
жариялаған кезде оналты байттық сан көрсетілуі мүмкін, ол интерфейстің
идентификаторы. Кез келген идентификатордың құрамында I символынан
басталатын аты және GUID (Globally Unique Identifier) глобальды
идентификатор болады.GUID тек қана идентификаторлар үшін ғана жасалып
қолданылмайды.Интерфейстер үшін GUID IID деп аталады.Кез келген СОМ
объектісінде Іunknown интерфейсі болады.Бұл интерфейстің тек қана үш әдісі
бар: Query Interface — интерфейске көрсеткіш алу, AddRef и Release —
объектіге сілтемелер санының бірге көбеюі және кішіреюі. Delphi да
интерфейс әдістерінің сәйкес аттары кішкене өзгеше: Querylnterface, AddRef,
Release.
Интерфейстер мұрагерлене алады.Интерфейстің мұрагерленуі бұл –
мұрагерлік интерфейстің құрамына алдыңғы интерфейстердің бүкіл әдістерінің
кіруін көрсететін декларация.Бірақ келесілерді түсіну керек:
Интерфейс - бұл класс емес.Класс интерфейстің іске асырылуы болып
табылады.Бірақ кластың құрамында белгілі бір программалау тіліндегі
әдістердің кодтары болады, ал интерфейте болмайды.
Интерфейс - қатаң түрде типтелген.Клиентте интерфейстің жүзеге
асырылуы да интерфейсте суреттелген әдістер мен қасиеттерді қолдануы керек.
1.3 Интерфейстерді жариялау
Интерфейстерді қолдау үшін Delphi Pascal тілінің синтаксисін қосымша
кілттік сөздермен кеңейтеді.Delphi – де интерфейсті жариялау interface
кілттік сөзі арқылы жүзеге асады.Мысалы:
type
IMyInterface = interface
['{412AFF00-5C21-11D4-84DD-C8393F76 3A13}']
procedure DoSomething(var I: Integer); stdcall;
function DoSomethingAnother(S: String): Boolean;
end;
IMyInterface2 = interface(IMyInterface)
['{412AFF01-5C21-11D4-84DD-C8393F76 3A13}']
procedure DoAdditional(var I: Integer); stdcall;
end;
Delphi – да GUID жаңа мағынасының генерациясын IDE – ге ауыстыру үшін
Ctrl+Shift+G батырмаларының бірігуін басу керек.
COM моделінің негізгі интерфейсі Iunknown болып табылады.Кез – келген
интерфейс Iunknown интерфейсінен мұрагерленеді және бұрын жарияланған
әдістерді міндетті түрде іске асыру керек. Iunknown интерфейсі System.pas
модулінде келесі түрде жарияланады:
type
IUnknown = interface
['{00000000-0000-0000-C000-00000000 0046}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
Iunknown әдісінің не үшін арналғанын қарастырайық.Соңғы екі әдіс
сілтемелерді санау механизмін жүзеге асыру үшін қажет.
function _AddRef: Integer; stdcall;
Бұл функция интерфейске жасалған сілтемелердің санын бірге көбейтеді
және есептегіштің жаңа мағынасын қайтарады.
function _Release: Integer; stdcall;
Бұл функция интерфейске жасалынған сілтемелердің санын бірге
азайтады.Жоғарыда айтылғандай егер сілтемелер саны нөлге тең болса, онда
жүйе сол кездегі бірде бір клиент жұмыс істемей тұрған объектіні жояды.
Бірінші әдіс интерфейсті іске асырып жатқан класқа сілтеме алуға
мүмкіндік береді.
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
Бұл функция кіру қасиеті ретінде интерфейстің идентификаторын
алады.Егер объект сұраныс жасалған интерфейсті іске асыратын болса, онда
функция:
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. Нолді қайтарады.
Болмаған жағдайда функция қателік кодын E_NOINTERFACE қайтарады.
System.pas модулінде Iunknown – ды және оның әдістерін жүзеге асыратын
TinterfacedObject класы жарияланған.Өз интерфейсіңді құру үшін осы класты
қолдану тиімді болады.Одан басқа Tobject класында интерфейстерді жүзеге
асырудың қолдауы бар.Оның келесі әдісі бар:
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
Егер объект сұраныс жасалған интерфейсті іске асыратын болса, онда
функция:
1. Оған жасалған сілтемені Obj параметріне қайтарады.
2. Қабылданған интерфейстің _AddRef әдісін шақырады.
3. TRUE - ні қайтарады
Болмаған жағдайда функция FALSE – ты қайтарады.Осындай жолмен Delphi –
дің кез келген класынан оның жүзеге асыратын интерфейсіне сұраныс жасауға
болады. Delphi – де интерфейсті іске асыру үшін міндңтті түрде класс
қолданылады.Ол үшін класты жариялау кезінде оның қандай интерфейстерді
жүзеге асыратынын көрсету керек.
type
TMyClass = class(TComponent, IMyInterface, IDropTarget)
Әдістерді іске асыру
end;
TmyClass класы IMyInterface және IdropTarget интерфейстерін жүзеге
асырады.Бұл жерде кластың бірнеше интерфейстерді жүзеге асыруы мұрагерлік
жолмен берілмегендігін түсіну өте маңызды.Кластарды суреттеу кезінде
көрсетілетін интерфейстер тек сол класс арқылы жүзеге асырылатын
интерфейстер бар екендігін көрсетеді.Интерфейсте жарияланған бүкіл
әдістердің аттары мен тізімдері, қасиеттері класта қолданылатын әдістерге
сәйкес келуі керек.Мысал келтірейік:
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
TTest = class(TInterfacedObject, ITest)
procedure Beep;
destructor Destroy; override;
end;
...
procedure TTest.Beep;
begin
Windows.Beep(0,0);
end;
destructor TTest.Destroy;
begin
inherited;
MessageBox(0, 'TTest.Destroy', NIL, 0);
end;
Бұл жерде Ttest класы Itest интерфейсін жүзеге асырады.Программадан
интерфейсті қолдануды қарастырайық.
procedure TForm1.Button1Click(Sender: TObject);
var
Test: ITest;
begin
Test := TTest.Create;
Test.Beep;
end;
Егер біз интерфейстің жүзеге асырылуын бірден жойғымыз келсе, онда
ауыспалының көзге көрінбейтін аймаққа шықпай тұрған кезде оған NIL
мағынасын меншіктеу керек.
Code:
var
Test: ITest;
T: TTest;
begin
T := TTest.Create;
Test := T;
Test.Beep;
Test := NIL; IUnknown._Release автоматты түрде шақырылады;
end;
Iunknown әдісінің автоматты түрде шақырылуына көңіл бөлу
керек.Сондықтан Iunknown әдісін өзіміз шақырмау керекпіз.Бұл автоматты
түрде сілтемелерді санаудың дұрыс жұмыс істеуіне кедергі келтіреді.Оны
болдырмау үшін келесілерді есте сақтау керек:
- интерфейске объекттің типін келтірген кезде _AddRef әдісі
шақырылады.
- интерфейске сұраныс жасап тұрған ауыспалыға басқа мағына меншіктеген
кезде _Release әдісі шақырылады.
Бір рет объекттен интерфейске сұраныс жасағаннан кейін, болашақта
объектті өз қолымызбен босатпау керекпіз.Осы уаққытан бастап объектпен тек
қана интерфейстік сілтемелер арқылы жұмыс істеу керек.Қарастырылған
мысалдарда интерфейсті алу үшін кластардағы қолданылған кодтар компиляция
кезеңінде өзгеріп отырды.Егер класс сұраныс жасап тұрған интерфейсті жүзеге
асырмаса онда программа компиляциядан өтпейді.Бірақ программаны орындау
кезінде интерфейске сұраныс жасауға мүмкіндік бар.Ол үшін as операторы
қолданылады.Ол QueryInterface – ті шақырады және сәттілік болған жағдайда
қабылданған интерфейске сілтемені қайтарады.Мысалы келесі код компиляциядан
өтеді, бірақ орындау кезінде келесі қатені шығарады Interface not
supported:
var
Test: ITest;
begin
Test := TInterfacedObject.Create as ITest;
Test.Beep;
end;
Сол уақытта да код:
var
Test: ITest;
begin
Test := TTest.Create as ITest;
Test.Beep;
end;
Компиляциядан өтеді және орындалады.
Енді интерфейстерді жүзеге асыруды толығырақ қарастырайық.
Екі интерфейсті жариялайық:
type
ITest = interface
['{61F26D40-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
ITest2 = interface
['{61F26D42-5CE9-11D4-84DD-F1B8E3A7 0313}']
procedure Beep;
end;
Енді осы екі интерфейсті де жүзеге асыратын класты құрайық:
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure Beep1;
procedure Beep2;
procedure ITest.Beep = Beep1;
procedure ITest2.Beep = Beep2;
end;
Көрініп тұрғандай кластың құрамында бірден екі Beep әдіс болуы мүмкін
емес.Сондықтан Delphi осындай аттарға байланысты конфликттарды шешуге
амалдарды ұсынады.Ол кластың қай әдісі интерфейсті жүзеге асырудың әдісімен
сәйкес келетіндігін анықтайды және көрсетеді.Егер TTest2.Beep1 и
TTest2.Beep2 әдістері ұқсас болса, онда екі әртүрлі әдістерді құрастырмай
ақ, класты келесі түрде жариялау керек:
TTest2 = class(TInterfacedObject, ITest, ITest2)
procedure MyBeep;
procedure ITest.Beep = MyBeep;
procedure ITest2.Beep = MyBeep;
end;
Екі интерфейсті жүзеге асыратын кластың мысалын қарастырайық:
type
TBeeper = class
procedure Beep;
end;
TMessager = class
procedure ShowMessage(const S: String);
end;
TTest3 = class(TInterfacedObject, ITest, IAnotherTest)
private
FBeeper: TBeeper;
FMessager: TMessager;
property Beeper: TBeeper read FBeeper implements ITest;
property Messager: TMessager read FMessager implements IAnotherTest;
public
constructor Create;
destructor Destroy; override;
end;
Интерфейстің жүзеге асырылуын басқа класқа жүктеу үшін implements
кілттік сөзі қолданылады:
{ TBeeper }
procedure TBeeper.Beep;
begin
Windows.Beep(0,0);
end;
{ TMessager }
procedure TMessager.ShowMessage(const S: String);
begin
MessageBox(0, PChar(S), NIL, 0);
end;
{ TTest3 }
constructor TTest3.Create;
begin
inherited;
FBeeper := TBeeper.Create;
FMessager := TMessager.Create;
end;
destructor TTest3.Destroy;
begin
Кластарды босату
FBeeper.Free;
FMessager.Free;
inherited;
end;
1.4 Интерфейстер және VCL Tcomponent класы
VCL Tcomponent базалық класында Iunknown интерфейсін жүзеге асыруға
мүмкіндік беретін көптеген әдістер жиынтығы бар.Бірақ кластың өзі бұл
интерфейсті жүзеге асырады.Бұл Tcomponent мұрагерлеріне Iunknown
интерфейсін жүзеге асыруды алаңдамай басқа интерфейстерді жүзеге асыруға
мүмкіндік береді.Бірақ Tcomponent _AddRef және TComponent._Release
әдістері программаны орындау кезеңдерінде сілтемелерді санау механизмін
жүзеге асырмайды.Сол себепті интерфейсті жүзеге асырушы Tcomponent
мұрагерлері үшін жадыны басқарудың автоматты түрі жұмыс істемейді.Бұл
жағдай жадыда уақытша орналасқан объектілерге қорқпай сұраныс жасалына
береді, себебі олар жадыдан өшіріліп кетпейді.Сонымен келесі код дұрыс және
қауіпсіз болып тпбылады:
type
IGetData = interface
['{B5266AE0-5E77-11D4-84DD-9153115A BFC3}']
function GetData: String;
end;
TForm1 = class(TForm, IGetData)
private
function GetData: String;
end;
...
var
I: Integer;
GD: IGetData;
S: String;
begin
S := '';
for I := 0 to Pred(Screen.FormCount) do begin
if Screen.Forms[I].GetInterface(IGetDa ta, GD) then
S := S + GD.GetData + #13;
end;
ShowMessage(S);
end;
Бұл код приложенияларындағы бүкіл формалардың ішінде IgetData
интерфейсін жүзеге асыру барының немесе жоқтығын тексереді.Егер форма бұл
интерфейсті жүзеге асыратын болса, онда оның әдісін шақырады.
Жоғарыда қаралған Tcomponent приложениядағы компоненттерді қатаң
типтілікті жоғалтпай біріктіруді және оңай соғуға мүмкіндік
береді.Компонентті жүзеге асыру ғана жеткілікті, ал шақырылған программада
оның бар немесе жоқтығын тексеру керек.
Мысалы біркелкі құралдар панелі және көптеген әртүрлі формалары бар
MDI приложенияны қарастырайық.Бұл құралдар панелінде Сақтау, Жүктеу
және Тазалау командалары бар, бірақ терезелердің әрқайсысы бұл
командаларға әртүрлі жауап береді.Интерфейстерді жариялау модулін жасайық:
unit ToolbarInterface;
interface
type
TCommandType = (ctSave, ctLoad, ctClear);
TCommandTypes = set of TCommandType;
TSaveType = (stSave, stSaveAS);
IToolBarCommands = interface
['{B5266AE1-5E77-11D4-84DD-9153115A BFC3}']
function SupportedCommands: TCommandTypes;
function Save(AType: TSaveType): Boolean;
procedure Load;
procedure Clear;
end;
implementation
end.
1- суретте. Программаның жұмысы
1.5 COM – сервер, құрамы және қолдануы
COM моделі программалау тілдерінен тәуелсіз көп рет қолдануға болатын
компоненттерді құруға мүмкіндік береді.Бұл компоненттерді COM серверлер
деп атайды.Олар орындаушы (EXE) файлдарынан және динамикалық (DLL)
кітапханаларынан тұрады.Егер олар COM – ды қолдайтын программалу тілінде
жазылған болса, онда оларды еш қиындықсыз кез – келген программадан
шақыруға болады.COM сервер (In-Proc сервер) шақырушы программаның адрестік
аймағында,(Out-Of-Proc сервер) өзіндік процесі ретінде немесе басқа
(Distributed COM) компьютерде орындала алады.COM берілгендерді
жіберуге(Marshalling) байланысты және клиент пен сервердің арасындағы
потоктік үйлесімділікке байланысты сұрақтарды автоматты түрде шешеді.
COMмен жұмыс істеу үшін керекті архитектуралық мәліметтер:
COM сервер – бұл арнайы түрде безендірілген және тіркелген
приложение.Ол клиенттерге өздері жүзеге асырған объектілерге сұраныс
жасауға мүмкіндік береді.Сервер динамикалық кітапхана ретінде немесе
орындалушы файл ретінде жасалынуы мүмкін.
DLL түріндегі сервер.
Бұл сервер әрқашанда оны жүзеге асырған (In-Process) приложенияның
адрестік аймағында орындалады.Осының әсерінен сервер әдістеріне жасалған
шақырулардың шығыны төмендейді.Бұл сервер қауіпсіз болып табылмайды.Себебі
оның жадысы шақырылған приложениялардағы қателіктерден сақтанбаған.Сонымен
қатар ол өшірілген компьютерде орындала алмайды, өйткені ол жерде DLL
жүктелген процесс жоқ.Мысалы ретінде Microsoft Transaction Server модулін
көрсетуге болады.
Орындалушы файл ретіндегі сервер.
Бұл сервер басқа приложениялардың сұранысы бойынша COM объектілерін
құруға мүмкіндік беретін Windows орындалушы файлы болып табылады.Мысалы
ретінде Microsoft Office пакетін келтіруге болады.Оның приложениялары COM –
серверлар болып табылады.
1.6 Ағымдар мен бөлмелер
Windows – көптапсырмалы және көпағымды орта.COM – ға қатысты бұл
келесілерді білдіреді:
- клиент пен сервер приложенияның әртүрлі ағымдарында немесе
процестерінде болуы мүмкін;
- серверге бір уақытта бірнеше клиент сұраныс жасаса болады.COM
технологиясы бұл мәселені COM клиенттері мен серверлері
орындалатын бөлмелер концепциясы (Apartments) арқылы
шешеді.Бөлмелер бірағымды (Single Threaded Apartment, STA)
және көпағымдыі (Multiple Threaded Apartment, MTA) болады.
STA
Бірағымды бөлмені құрған кезде COM терезе құрады.COM – серверінің кез-
келген әдістерінің бірін шақырған кезде сол бөлмедегі терезеге PostMessage
арқылы хабарлама жіберіледі.Осындай жолмен шақырылған әдістер тізімі
құрылады және әрқайсысы алдыңғысы өңделгеннен кейін өңделеді.Бірағымды
бөлмелердің негізгі ерекшеліктері:
1.Программист әдістердің синхрондалуы туралы алаңдамаса
болады.Ағымдағы әдістің аяқталғанынша объектінің ешқандай басқа объектісі
шақырылмайды.
2.Программист класс өрістерінің рұқсатының синхрондалуы туралы
алаңдамаса болады.Себебі бір уақытта тек қана бір ғана әдіс орындалуы
мүмкін – бір уақытта өріске екі әдіспен рұқсат алу мүмкін емес.
STA – ның кемшіліктері:
1.Әдістерді шақырған кездегі синхрондалуға кететін қосымша шығындар.
2.Алдыңғы әдіс өңделіп бітпегенше келесі әдістің өңделуі мүмкін
емес.Мысалы бір минуттық әдіс орындалып бітпегенше COM объектті қолдануға
болмайды.Дегенімен COM – объектісін жүзеге асырудың ең тиімді жолы STA
болып табылады.MTA – ны қолданудың тек бір мағынасы бар, егер STA белгілі
бір ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz