4.3.1.1. Caracteristicile generale ale COM
Una dintre realizările cheie ale Windows este modelul multicomponent al obiectelor (Component Object Model, COM). Modelul COM descrie modul în care interacționează programe de orice tip. Programul server (serverul COM) oferă serviciile înconjurătoare cu propriile servicii, iar programul client (client COM) utilizează serviciile serviciilor disponibile. Interacțiunea obiectelor COM poate funcționa atât în același proces cât și în diferite procese, inclusiv cele care rulează pe diferite mașini care rulează sisteme de operare diferite. COM este atât o specificație (definind ordinea creării de aplicații care interacționează), cât și implementarea (sub forma unui set standard de funcții API). În plus, COM este un sistem orientat spre obiecte distribuit pe platformă, proiectat să creeze componente software interactive.
Din punctul de vedere al unui observator extern, componenta software creată de COM este o cutie neagră cu următoarele caracteristici:
1. Ușor de conectat la sistemul de operare.
3. Ușor de integrare în software-ul.
4. O modalitate universală de a accesa metode și proprietăți din orice limbaj de programare modern.
Microsoft a standardizat atât modul în care un obiect COM este reprezentat în memoria calculatorului, cât și caracteristicile identificării metodelor și proprietăților acestui obiect. Prin urmare, în documentația oficială Microsoft (MSDN), când COM este descrisă, se menționează în mod repetat că modelul COM corespunde unui standard binar (cu alte cuvinte, universal).
La prima vedere, cutia neagră COM este foarte asemănătoare DLL-ului.
La fel ca COM, DLL vă permite să vă reutilizați codul, să vă conectați ușor la sistemul de operare și să vă integrați în software. Dar o bibliotecă conectată dinamic nu este capabilă să garanteze că funcțiile exportate de ea nu pot fi cauzate de nici un alt limbaj de programare fără restricții. În plus, atunci când lucrăm cu un DLL, întâlnim o serie de restricții legate de locația DLL: biblioteca trebuie fie să fie localizată într-o listă strictă de directoare, fie trebuie înregistrată în căile de sistem. O sarcină și mai dificilă este să încărcați un DLL de pe alt computer. Spre deosebire de DLL, modelul COM oferă o modalitate universală de încărcare a obiectelor sale indiferent de locația lor.
Din primii pași ai studierii COM este important să înțelegem că acest lucru nu este doar un alt limbaj de programare orientat pe obiect, cu propria sintaxă, semantică și detalii de implementare. Este mai corect să vorbim despre COM ca un standard care definește modelul de interacțiune între obiecte.
În interesul aplicațiilor pentru modelele COM și client, biblioteca COM (Biblioteca COM) funcționează activ. Din punct de vedere fizic, biblioteca COM este un set de fișiere executabile și biblioteci legate dinamic. Este capabil:
1. Oferiți servicii unui set de funcții API care să faciliteze dezvoltarea aplicațiilor COM. De exemplu, pentru aplicațiile client, se intenționează metodele care creează obiecte. Pentru aplicațiile server din bibliotecă există instrumente pentru demonstrarea obiectelor lor COM.
2. Generați un identificator unic al obiectului, căutați obiectul solicitat prin identificatorul său.
3. Apelați procedurile de la distanță dacă serverul COM este găzduit pe un alt computer.
4. Gestionați alocarea memoriei în interesul proceselor care interacționează și controlați eliberarea memoriei.
Conform acordului existent numele tuturor metodelor de bibliotecă Win32 API COM începe cu prefixul «Co», de exemplu, CoCreateGuid (), CoCreateInstance (), CoUn- inițializa () și așa mai departe. N.
4.3.1.2. Elemente ale aplicației COM
Dezvoltatorul unei aplicații COM standard va întâlni în orice caz două dintre elementele sale:
Serverul COM este un modul separat implementat ca un fișier EXE executabil independent sau un fișier dinamic DLL.
Modelul COM oferă două tipuri de server: interne și externe.
Luați în considerare clasele VCL livrate serviciului de tehnologie COM.
Structura serverului COM ca minimum include:
1. Una este singura instanță a clasei TcomServer care încapsulează singur serverul COM. Accesul la acest obiect este furnizat de ComServer variabilă globală creată la pornirea serverului.
2. Descrierea obiectului COM (sau a mai multor obiecte), prototipul căruia este clasa TComObject.
3. Clasa de fabrică (una pentru fiecare tip de obiect COM). Baza fabricii de clasă este clasa TComObjectFactory. Singura sarcină a clasei fabrică este de a crea alte obiecte - exemple ale clasei TComObject.
Odată cu lansarea următoarei versiuni a bibliotecii, nu este nevoie să actualizați întregul software.
În modelul COM, procesul de creare a unui obiect nou nu este controlat de mediul de programare sau chiar de obiectul însuși, iar a treia (într-o oarecare măsură neutră) parte este fabricile de clasă. Fabrica este responsabilă în întregime de alocarea memoriei pentru viitorul obiect COM și, deși nu ne pare paradoxal, detaliile construcției acestui obiect nu au nici cea mai mică idee.
Pentru fiecare individ, clasa COM este o fabrică separată.
Pentru a crea o nouă instanță a unei clase, fabrica utilizează un șablon de clasă sau un model de fabrică.
Un exemplu de fabrică este o clasă specială utilizată pentru a crea o instanță a unei alte clase.
Datorită abordării "fabrică", procesul de creare a unui obiect nou este separat de caracteristicile implementării sale.
Întreținerea fabricilor este controlată de managerul fabricii - un obiect al clasei TComClass - Manager. Managerul de instanță este creat automat și este disponibil în aplicația serverului COM datorită variabilei globale ComClassManager.
Clientul COM utilizează serviciile serverului, dar nu are nici cea mai mică idee despre caracteristicile implementării acestuia. Accesul clientului la serviciile unui obiect COM încorporat în server se realizează numai prin interfețele acestui obiect; aceasta este caracteristica cheie a întregului model COM. După ce a primit pointerul la interfață, aplicația clientului dobândește dreptul de a apela metodele obiectului.
4.3.1.3. Obiect COM
În centrul unui model multicomponent este conceptul de obiect COM.
Din punct de vedere fizic, un obiect COM este o colecție de date și metode care controlează aceste date. Structura obiectului COM este semnificativ diferită de butoanele și liniile de intrare cunoscute de noi din biblioteca VCL. Diferența cheie dintre COM și obiectul Delphi familiar este modul în care obiectul COM oferă acces la datele sale.
Structura obiectului COM materializează ideea unui basm despre Koshchee Immortal. Nu uitați: moartea în ac, acul în ou, ou într-o rață, o rață într-un iepure de câmp, iepurele în piept, piept într-un stejar. Necunoscute, citit în Microsoft basmele rusă sau nu, proiectarea programatori COM-obiect Corporation a mers cu încredere calea bătut Koshcheev - acces direct la date din afara COM- obiect, în principiu, nu există. Fiecare câmp al obiectului este ascuns în interior și poate fi întreținut numai prin metode obiect COM. Metodele obiectului nu sunt, de asemenea, foarte comunicante; Ele sunt ambalate atât de adânc, încât sunt accesibile numai prin indicatorii lor.
Fig. 6. Modelul obiectului COM
Având acces la interfața IUnknown necesară, programul sau orice alt obiect poate accesa imediat funcția QueryInterface () și poate afla despre toate celelalte interfețe disponibile pentru acest obiect. Pe diagrame, interfața IUnknown este afișată în partea superioară a obiectului (Figura 7).
Fig. 7. Reprezentarea unui obiect COM sub forma unei scheme
În mediul de programare Delphi, obiectul COM se bazează pe clasa TCOMObject. Interfața sa este creată pe baza referinței pentru toate clasele de interfață IInterface.
La baza sa, interfața este un contract între un obiect COM și o aplicație client, în care obiectul COM garantează clientului furnizarea anumitor servicii. Serviciile sunt metode definite în interfață. Dar, deși interfața are dreptul să declare anteturile metodei, nici una dintre metodele sale nu are o descriere. Acest lucru se datorează faptului că interfața nu are o secțiune de implementare, ci doar declară numele metodelor și o listă de parametri. Clienții pot accesa datele obiectului COM numai prin utilizarea indicatorului de interfață.
Un alt aspect semnificativ al interfeței este că, în cazul în care, trebuie să fie declarată necesară de obiect COM-state ale existenței unei definiții a interfeței interfeței pentru a menține metodele interne ale obiectului și să se întoarcă orice valori, chiar dacă numai un mesaj de eroare banală.
Interfețele pot fi moștenite - interfața pentru copii trebuie să includă toate metodele strămoșilor săi. Toate interfețele existente sunt moștenite din interfața de bază IUnknown.
Este necesar să specificăm încă două reguli, a căror respectare este necesară atunci când proiectăm un obiect COM:
În cadrul unui sistem separat, fiecare interfață trebuie să aibă un GUID unic și un nume începând cu simbolul "I".
4.3.1.5. Procedura de apelare a serverului de către aplicația client
Fig. 8. Procedura de contactare a clientului cu serverul
În timpul instalării aplicației COM, informațiile despre obiectele COM disponibile sunt introduse în registrul sistemului de operare. Mai întâi, este un identificator care identifică în mod unic o clasă de obiecte (identificator de clasă, CLSID). ID-urile de clase sunt stocate în următoarea ramură a registrului Windows:
CLSID este un fel de identificator unic global (GUID) deja întâlnit anterior. Acesta este un număr unic de 128 biți folosit pentru a identifica interfețele, obiectele și clasele. Unicitatea este obținută prin utilizarea algoritmului original pentru generarea numărului furnizat de funcția Win32 API CoCreateGuid ().
În procesul de lansare a unui obiect COM, biblioteca sistemului COM ia o parte directă. În Fig. 8 prezintă schematic secvența de acțiuni ale clientului, ale bibliotecii și ale serverului COM la crearea primei instanțe a obiectului COM.