DCOM & Remote Automation
Probabil că multi dintre dvs.
au auzit de COM sau DCOM (Distributed COM) sau Remote Automation.
Ce este asta si cum se poate utiliza concret în programe cititi mai
jos. Ce nu îsi propune să dezbată acest articol sunt: programarea
bazată pe obiecte în VB, probleme legate de retele, securitatea retelelor,
etc.
Distributed COM este un cadru de dezvoltare, instalare si utilizare a unor componente, distribuite pe mai multe calculatoare. Adica, să presupunem că avem o componentă (clasă) care calculează ceva dar care vrem să o executăm pe un calculator din retea folosit doar pentru acest lucru. Să presupunem ca avem un calculator puternic pe care instalăm o componentă care calculează dacă un număr dat este prim sau nu. Nu ne propunem să calculăm asta pe fiecare calculator din retea pe care am instalat programul pentru că nu sunt suficient de puternice, asa că pe un calculator client oarecare din retea doar apelăm acea metodă a obiectului care ne spune (true sau false) dacă numărul dat ca parametru este prim sau nu (acesta poate fi si generat aleator, de exemplu). Deci, pe un calculator oarecare se generează un număr, care este pasat unei componente ce rulează pe un calculator (server) mai puternic din retea care calculează dacă numărul este prim sau nu. (presupunem că numărul este foarte mare si procedura de calcul ar dura mult pe un calculator client care apelează serverul, mai slab din punct de vedere al performantelor).
Să vedem cum se poate rezolva asta. Putem de exemplu să utilizăm un control Winsock pentru a deschide un canal de comunicatii cu un server pe un port stabilit de noi. La acel port trimitem o secventă se date (stabilită de noi), iar programul server asculta acel port. În functie de comanda primită, calculează ceva si transmite rezultatul pe aceeasi cale.
Însă în VB există o solutie (de fapt două) mult mai elegantă: folosind Remote Automation sau Distributed COM. Cu acestea lucrăm în acelasi fel în care se lucrează pentru un singur calculator fară să tinem cont de faptul ca programul se executa distribuit pe mai multe calculatoare. Se lucrează cu clase având metode si proprietăti, fără să se tină cont că de fapt clasele sunt pe alt calculator. Pentru asta e nevoie de niste programe suplimentare dar care sunt usor de instalat.
Mai întâi să vedem ce înseamnă Remote Automation. VB 5.0 si 6.0 vine cu suport pentru remote Automation care înseamnă simplu utilizarea unor clase aflate la distanta (remote) prin OLE Automation. Se utilizează două programe instalate lângă shortcut-ul de lansarea VB-ului: Automation Manager (fără interfată grafică, trebuie doar lansat pentru a accepta comenzi de la distantă) si RemAuto Connection Manager (câteva setări pentru clasa respectivă - o sa le explic mai târziu).
DCOM este la fel de simplu. Dacă lucrati pe Windows NT acesta este instalat automat. Pentru Windows 9x trebuie instalat manual si este în două variante: DCOM98 (atât pentru Windows 98 cât si pentru Windows 95) si DCOM95 (doar pentru Windows 95, acesta fiind mai nou !!). Vezi aici diferentele(Q198600 Differences Between DCOM95 and DCOM98). Mai întâi trebuie instalat suportul pentru DCOM instalând, la fel, două programe: dcom98.exe respectiv dcom98cfg.exe care se pot găsi pe CD-ul cu Windows 98 sau în kitul de la Visual Studio 6.0. Acestea se pot lua, cred, si de la Microsoft.com dar nu stiu exact adresa. Mai multe amănunte găsiti la Q196208 DCOM98 Release Notes.
După ce am instalat suportul pentru Remote Automation sau pentru DCOM putem trece la dezvoltarea programului. Aici vom testa o clasă mai simplă cu care încerc să explic utilizarea DCOM-ului. Să definim o clasă care are doar o functie Mesaj ce returnează un mesaj simplu si o procedura PuneText care adaugă un string dat ca parametru într-un fisier text de pe server. Deci pe server (sub Windows NT) deschidem în VB un nou proiect 'ActiveX EXE' (neapărat de acest tip, nu altele). Dacă doriti ca programul server să fie un calculator cu Windows 9x cititi Q165101 : HOWTO: Use Windows 95 or Windows 98 as a DCOM Server despre utilizarea acestora ca servere de DCOM. Am numit proiectul DemoDCOM_Ro iar singura clasă din proiect se numeste Test (MultiUse = True). O să vedeti că numele claselor sunt destul de importante pentru că asa vor fi declarate variabilele obiect din programul client (care utilizează propriu-zis acestă clasă). Codul clasei este următorul:
Public Function Mesaj() As String
Mesaj = "Viziteaza http://vb4ro.cjb.net"
End Function
Public Sub PuneText(s As String)
Open "c:\testDCOM.txt" For Append As #1
Print #1, s
Close #1
End Sub
Mai exista câteva lucruri de care trebuie tinut cont:
- La Project Properties, în pagina 'Component', se marchează 'Remote Server' (asta va creea 2 fisiere suplimentare cu extensiile VBR si TLB care se folosesc pentru înregistrarea programului server pe calculatorul client).
- La Project Properties, în pagina 'General', se poate pune o descriere a programului server care va apare în lista 'References' în programul client (la Project Description) (optional).
- Tot acolo, la 'Version Compatibility' se marchează 'No compatibility' sau 'Project compatibility'. După ce am compilat prima dată proiectul putem marca 'Binary compatibility' pentru a nu i se creea clasei rezultate după compilare alt identificator (CLSID) cu care se înregistrează în Registry. (optional)
După ce am compilat proiectul rezultă un EXE (care rămâne pe server) si 2 fisiere cu extensia TLB si VBR. Acestea 2 le copiem undeva pe calculatorul client si vor fi folosite pentru a apela obiectul aflat pe server. Pentru înregistrarea lor pe calculatorul client se foloseste utilitarul clireg32.exe care vine odată cu VB-ul, astfel:
path\Clireg32.exe nume_fisier.VBR
La înregistrarea serverului pe calculatorul client o sa fiti întrebati cum se face comunicarea, prin DCOM sau prin Remote Automation precum si numele calculatorul server si eventual protocolul de comunicare. Alegeti DCOM si un protocol care îl aveti instalat în retea (TCP/IP, IPX, NetBIOS). Pentru a sterge o clasă server (dezînregistra) se foloseste acelasi program de mai sus cu parametrul -u.
path\Clireg32.exe nume_fisier.VBR -u
După asta se creează pe calculatorul client un nou program (poate fi Standard EXE) la care la 'References' se adaugă manual (de la Browse) fisierul cu extensia TLB.
După asta se utilizează clasa de pe server absolut ca si cum ar fi pe acelasi calculator. Vezi mai jos un mic exemplu de program client care utilizează clasa server.
Dim oDCOM As New DemoDCOM_Ro.Test
Private Sub Command1_Click()
MsgBox oDCOM.Mesaj
End Sub
Private Sub Command2_Click()
oDCOM.PuneText Text1.Text
End Sub
Tot ce am scris mai sus se foloseste cu DCOM. A doua metodă de utilizare a unei clase la distantă se face prin 'Remote Automatition'. Modul în care creem programul server sau cel client (clasa care utilizează serverul) este la fel. Ceea ce diferă dacă se foloseste Remore Automation sunt câteva lucruri:
- La înregistrare se alege Remote Automation în loc de DCOM (când se apelează Clireg32).
- Pe calculatorul server trebuie sa ruleze Automation Manager (să fie lansat). Dacă pe calculatorul server nu exista VB-ul de exemplu, si nu există acest program atunci se face un kit de instalare cu componenta respectivă, iar în kit este inclus pe lângă run-time-ul VB-ului si câteva dll-uri ce tin de Remote Automation (Autprxx.dll unde xx e 16 ori 32). Se instalează si RemAuto Connection Manager.
În rest este la fel. Când ar trebui să folosim DCOM si când Remote Automation:
- DCOM merge doar pe Win32, deci dacă se utilizează componente pe 16 biti trebuie să folositi Remote Automation
- Îi mai complicat să folositi un calculator cu Windows 9x pe post de server asa că dacă programul server este pe un astfel de calculator folositi Remote Automation.
- Pe viitor se are în vedere utilizarea doar a DCOM-ului.
- Pentru o securitate sporită se foloseste DCOM.
Până acum nu am vorbit deloc de un subiect care trebuie neapărat să-l aveti în vedere si anume securitatea. Nu oricine poate face orice cu componetele ce se pot executa la distantă (pe server). Pentru Remote Automation se porneste RemAuto Connection Manager unde apare în stânga o lista cu toate clasele iar în dreapta setările referitoare la o anume clasă. În pagina 'Client' se poate seta daca respectiva clasă se poate sau nu să fie creată de la distantă. Optiunile sunt:
- Disallow All Remote Creates - cea mai restrictivă, nu se permite crearea nici unui obiect de la distantă
- Allow Remote Creates by Key - pentru o anume clasă se poate specifica dacă se poate sau nu crea de la distantă în functie dacă este sau nu marcată Allow Remote Activation
- Allow Remote Creates by ACL - se poate utiliza doar sun NT pentru a defini utilizatorii care pot crea clase de la distantă
- Allow All Remote Creates - oricine poate crea clase pe server (nu ar trebui activată decât pe servere absolut sigure)
Pentru DCOM există un alt utilitar care rezolvă problema securitătii si anume dcomcnfg care se poate lansa direct din fereastra Run. Optiunile referitoare la securitate sunt limitate pe Windows 9x de aceea ar trebui folosit pentru server Windows NT, la care securitatea este o problemă mult mai serioasă. Dacă se alege o clasa oarecare la Properties se poate set câtiva parametri: Location, Security, Identity. (ultimii 2 apar doar la Windows NT). La 'Location' se poate alege 'Run application on this computer' sau pe altul specificat de dvs. La 'Security' se pot seta parametrii de securitate folositi la accesare, la lansare sau la configurarea obiectului (doar utilizatorii din listă atasată au aceste drepturi). 'Identity' se referă la identitarea userului care a apelat serverul sau dacă obiectul o să fie utilizat ca apartinând unui user anume (identity user, launching user, this user).
Pentru toate clasele sunt câtiva parametrii (la Default Properties Security) care se pot seta referitori la functionarea DCOM-ului: dacă este activat sau nu, nivelul de autentificare (fără autentificare, doar la conexiune, la fiecare pachet, etc.) precum si 'Impersonation Level'.
Despre DCOM cititi si fisierele care se instalează automat odată cu instalarea lui (C:\WINDOWS\SYSTEM\dcom98) sau puteti încerca exemplul de la M$ referitor la acest subiect sau sa cititi Q161837 Create a DCOM Client/Server Application sau Q175510 VB5DCOM.EXE: Using Callbacks and WithEvents with DCOM
Evident acest subiect este mult mai vast si sunt cărti întregi despre asta. De fapt acest articol îsi propune să fie doar o scurtă introducere în această temă.
|