Pentru a crea un server COM, Delphi oferă o gamă largă de experți care automatizează executarea sarcinilor de rutină și permit programatorului să se concentreze asupra implementării funcționalității. Wizards sunt accesibile prin intermediul comenzii de meniu File-> New, din fila ActiveX
Pentru a face ca serverul COM un fișier EXE, trebuie doar să adăugați un modul cu un obiect COM la acesta. Pentru a crea un server COM sub forma unui DLL, trebuie mai întâi să creați o bibliotecă care să fie proiectată să îndeplinească cerințele COM. Acest lucru se face folosind expertul ActiveX Library. Când îl selectați, va fi creat un nou proiect care implementează DLL-ul și se va genera următorul cod:
DLL-ul pe care îl creați exporta funcțiile necesare funcționării COM și nu vă puteți îngrijora munca de rutină și începeți imediat să implementați serverul COM. Pentru aceasta, selectați expertul de obiect COM.
Din completarea câmpurilor acestui formular depinde implementarea obiectului COM creat
ClassName Numele clasei Delphi care implementează serverul COM. Expertul va crea o clasă de piesă cu acest nume. Sub același nume, serverul COM va fi înregistrat în registru.
Instanță Specifică modul de creare a obiectelor COM. Parametrul poate lua următoarele valori: Intern Obiectul poate fi utilizat numai în interiorul acestei aplicații. Instanță singulară Crearea fiecărei instanțe a obiectului pornește o nouă instanță a aplicației server. După crearea unui obiect „Fabrica de obiect“ cerere elimină informații personale din lista sistem de fabrici înregistrate care face COM pentru a crea un obiect nou pentru a rula serverul în noua aplicație de proces Instance multiplă după crearea instanță obiect „fabrică“ nu se elimina din lista înregistrată. Când creați o cerere pentru un nou obiect COM va detecta în această listă și să solicite crearea la aceeași fabrică, și o nouă instanță a obiectului va fi creat în aceeași aplicație. Cu alte cuvinte, nu se deschide mai mult de o instanță de server pentru a crea toate obiectele de acest tip. Acest parametru are sens doar pentru serverele EXE, pentru DLL este ignorat.
Threading Model Modelul de streaming al serverului. Această setare depinde de tipul de server (EXE sau DLL) Single Nu există nici un suport fir. Pentru DLL-server în timpul înregistrării nicio setare ThreadingModel va fi creat pentru EXE-server pentru a specifica această opțiune (spre deosebire de oricare alta) nu se va instala de pavilion IsMultiThread va fi setat STA. De obicei, acest model este utilizat pentru apartament server intern Pentru un server DLL în registru va fi creat opțiunea ThreadingModel = Apartament, pentru EXE - creat MTA Atât în registru pentru serverul DLL este - a stabilit opțiunea gratuit STA ThreadingModel = gratuit, pentru a EXE va fi creat pentru serverul de DLL în registru set de parametri ThreadingModel = Ambele, pentru EXE - creat MTA
Includerea librăriei de tip Setarea acestei opțiuni face ca biblioteca să includă tipurile - o resursă binară specială care descrie interfețele implementate de server, metodele și parametrii de apel. COM oferă instrumente standard pentru lucrul cu bibliotecile de tip. În special, Delphi poate importa biblioteca de tip disponibilă pe server și poate construi automat un modul de interfață pentru a lucra cu acesta. Când se utilizează biblioteca de tip, interfețele sunt descrise utilizând Editorul de tip bibliotecă. Obiectul este moștenit de la TTypedComObject Dacă această casetă de selectare este dezactivată, atunci obiectul este moștenit de la TComObject. Aceasta este o implementare mai ușoară a serverului.
Interfețe implementate Acest câmp este activat numai dacă obiectul nu utilizează biblioteca de tip. În acest caz, ar trebui să descrieți interfețele din codul programului și să le listați în acest câmp, de exemplu "ITest, IAnotherTest"
Marchează interfața Oleautomation Setarea acestui flag face ca serverul COM compatibil cu automatizarea OLE. Trebuie să utilizați numai tipurile de date compatibile cu automatizarea OLE în metodele de interfață. Acest lucru este necesar dacă doriți să transferați un link către interfața dintre diferite "camere". O astfel de operație, numită triaj de interfețe, necesită scrierea unui DLL proxy / stub special. Cu toate acestea, dacă interfața este marcată ca Oleautomation, această lucrare este efectuată de OLE Marshaller și veți fi cruțați de munca inutilă.
. Pentru a sprijini Oleautomation regruparea necesar ca: • serverul a fost moștenit de la TTypedComObject (punerea în aplicare a IDispatch nu este necesară) • Toate metodele de interfață trebuie să fie declarate ca safecall. Dacă creați o interfață moștenește de la IUnknown, atunci în mod implicit toate metodele sale sunt declarate ca fiind stdcall. Pentru a crea safecall metode trebuie să Tools-> caseta de dialog Opțiuni de Mediu pe Biblioteca fila Type Setați comutatorul Safecall maparea funcție la valoarea Toate interfețele v-masă
Server fără bibliotecă de tip
Un astfel de server, dacă nu implementează interfața IMarshall, poate funcționa numai într-o "cameră" cu clientul, deci ar trebui folosit doar pentru serverele In-Process cu un model de streaming identic cu clientul.
Atunci când creați un server care nu include o bibliotecă de tip, trebuie să specificați interfețele pe care interfețele le implementează în asistent. Specificați numele interfeței ITest. După terminarea asistentului, se va crea următorul modul:
Windows, ActiveX, Clase, ComObj;
TTest = clasa # 40; TComObject, ITest # 41;
TComObjectFactory. crea # 40; ComServer, TTest, Class_Test,
'Test'. ''. ciMultiInstance, tmApartment # 41; ;
Dacă creați un COM-server, care poate fi utilizat de către diferiți clienți (și nu doar pentru un anumit proiect, în care specificațiile clienților strict definite) nu este recomandată serverele fără triajul suport de date, pentru că în acest caz, este imposibil să fie sigur că găsirea în aceeași cameră“ "Cu clientul. Dacă fac o astfel de server - este necesar pentru a reflecta specificația necesară a documentației clientului pe ea.
Să analizăm mai detaliat codul generat. De interes special este secțiunea Inițializare. Creează o instanță a unei "fabrici de obiecte" - un server COM care implementează interfața IClassFactory2. COM va fi contactat pentru a crea o instanță a obiectului Test. VCL implementează automat toate activitățile de rutină de interacțiune cu COM.
Pentru a implementa serverul, este necesar să scrieți un modul de interfață care să descrie interfața implementată. În plus, vom pune în ea o descriere a Clasa_Test constantă și o vom adăuga la linia de utilizări a Unității1
procedura ShowIt # 40; S: String # 41; ;
Acest modul conține toate informațiile necesare pentru utilizarea serverului și ar trebui să fie utilizat la compilarea clientului.
Să adăugăm codul obiectului COM prin implementarea metodelor interfeței implementate:
Windows, ActiveX, Clase, ComObj, TestInterface;
TTest = clasa # 40; TComObject, ITest # 41;
procedura ShowIt # 40; S: String # 41; ;
MessageBox # 40; 0. PChar # 40; S # 41;. NIL. 0 # 41; ;
TComObjectFactory. crea # 40; ComServer, TTest, Class_Test,
'Test'. ''. ciMultiInstance, tmApartment # 41; ;
După compilarea proiectului, vom primi fișierul Project1.dll
Ultimul pas este înregistrarea serverului COM.
În linia de comandă, tastați: "regsvr32 project1.dll"
Dacă totul se face corect, ar trebui să vedeți un mesaj cu privire la înregistrarea de succes: "DllRegisterServer în Project1.dll a reușit".
Puteți începe să scrieți un client. Pentru a face acest lucru, creați un nou proiect, adăugați modulul cu forma sa principală, șirul utilizează TestInterface și scrieți următorul cod:
utilizează TestInterface, ComObj;
procedura TForm1. Button1Click # 40; Expeditor: TObject # 41; ;
Test: = CreateComObject # 40; Class_Test # 41; ca ITest;
Testul. ShowIt # 40; „Bună“ # 41; ;
După cum puteți vedea din acest exemplu, crearea și utilizarea unui server COM nu este mai dificilă decât lucrul cu clasele obișnuite Delphi. Un server fără o bibliotecă de tip este o alegere bună pentru implementarea serverelor COM utilizate în interiorul unui proiect, deoarece utilizarea acestuia necesită un modul de interfață. Atunci când transferați serverul către alți dezvoltatori, va trebui să transferați acest modul la acestea și, dacă este necesar, să îl traduceți într-o altă limbă (de exemplu, C).
Server cu bibliotecă de tip
O bibliotecă de tip este o resursă binară specială care descrie interfețele și metodele implementate de serverul COM. Pe lângă faptul că are o bibliotecă de tip, serverul trebuie să suporte interfața IProvideClassInfo. În Delphi, un astfel de server este implementat prin moștenirea acestuia de la TTypedComObject. Pentru a face acest lucru, lăsați caseta de validare Include Type Library din expertul Obiect nou COM activat.
Creați un server COM ca EXE (desigur, acesta poate fi, de asemenea, creat ca un DLL).
Mai întâi, creați un nou proiect (File-New Application) și apoi adăugați un obiect COM la acesta.
Dacă nu dezactivați caseta de validare Include Type Library, expertul va crea nu unul, ci două module. Primul se aseamănă cu cel creat mai devreme.
Windows, ActiveX, Clase, ComObj, Project1_TLB, StdVcl;
TTest1 = clasă # 40; TTypedComObject, ITest1 # 41;
TTypedComObjectFactory. crea # 40; ComServer, TTest1, Class_Test1,
ciMultiInstance, tmApartment # 41; ;
ITest1 = interfață # 40; IUnknown # 41;
funcția ShowIt # 40; const S: WideString # 41;. hresult; stdcall;
Și în Unitatea 1:
TTest1 = clasă # 40; TTypedComObject, ITest1 # 41;
funcția ShowIt # 40; const S: WideString # 41;. hresult; stdcall;
funcția TTest1. ShowIt # 40; const S: WideString # 41;. hresult;
Putem scrie doar implementarea metodei:
funcția TTest1. ShowIt # 40; const S: WideString # 41;. hresult;
MessageBoxW # 40; 0. PWideChar # 40; S # 41;. NIL. 0 # 41;
Rezultat: = S_OK; // Codul de succes standard
Pentru a înregistra serverul, este suficient să îl rulați o dată pe computerul clientului.