Tartalom DCOM
Szoftvertechnológia elıadás
Történeti áttekintés Architektúra DCOM vs CORBA Példá
2
Történeti áttekintés
1987 – Dynamic Data Exchange (DDE)
Történeti áttekintés
Windows 2.0-ban Windows alkalmazások közötti adatcsere Ma is használatos (pl. vágólap)
NetDDE
1990 – Object Linking and Embedding (OLE 1.0)
NetBIOS protokol felett Windows XP-ig használatos (pl. Fekete Macska) A Windows Vista már nem tartalmazza
Üzenetek helyett dokumentum-megosztás (Virtual Function Table –VTBL) Windows 3.0
1993 – Component Object Model (COM)
Folyamatok közötti kommunikáció Dinamikus objektum-készítés Objektumok nyelv-független megvalósítása 1997-ig nem használták a COM elnevezést
3
Történeti áttekintés
COM alapú implementáció Windows 3.1
1994 – OLE Custom Controls
Történeti áttekintés
1993 – OLE 2.0
1997 – Distributed Component Object Model (DCOM)
OLE 2.0-t támogató tárolókba ágyazhatók 1996-tól ActiveX Hálózati megosztása a dokumentumoknak
COM+
4
Windows NT SP 4.0 Új esemény-modell
5
Eredeti neve Network OLE Válasz a CORBA-ra RPC-t használ Alternatív implementációk is léteznek Más (nem Windows) rendszerek is támogatják 6
1
DCOM
Platform-független
Minden olyan operációs rendszerben mőködik, amely nyújt DCOM támogatást Windows, Unix, Macintosh
Interfész
Nyelv-független
Objektum-model
C++, VJ++, Delphi
Átviteli mód-független
TCP/IP, UDP. IPX/SPX, NetBIOS, AppleTalk
Platform-független Nyelv-független Microsoft Interface Definition Language (IDL) Lefordítható a szükséges programozási nyelvre
Komponens
Platform-specifikus Számos nyelven készülhet (C, C++, Delphi stb.)
7
Felhasználás (folyamaton belül)
Használat Megosztandó objektum elkészítése
1.
3.
5.
Komponens Interfész(ek) Proxy
Kliens
Proxy objektum és az interfészek eljuttatása a felhasználói oldalra Proxy és interfészek regisztrációja
2.
4.
8
Regisztrációs adatbázisban (registry) A COM környezet innen olvassa ki az objektum elérhetıségét (a tároló szerver címét)
Komponens
Hatékony
Az interfész lefordítása a használt nyelvre Az objektum felhasználása a programunkban
Nincs szükség az ORB-re Nincs hálózati kommunikáció
9
Felhasználás (folyamatok között) COM környezet
Kliens Security
DCE RPC
LPC
10
Felhasználás (távolról)
COM környezet Security
Komponens DCE RPC
COM környezet
Kliens Security
LPC
COM környezet
DCE RPC
Protocol Stack
Stabil Local Procedure Call (LPC) technológiával
Security
Komponens DCE RPC
Protocol Stack
Hálózat
11
12
2
Felhasználás (DCOM)
DCOM vs CORBA
COM környezet
Kliens Security OLE
COM környezet
DCE RPC
Security
Protocol Stack
Komponens
DCOM
DCE RPC
Protocol Stack
SCM
SCM
Registry
Registry DCOM network
protocol
Egy objektumnak több interfésze is lehet Az interfészeket IDL nyelven írja le A kliens egy interfészére mutató referencián keresztül használja az objektumot RPC alapú kliensszerver kommunikáció
CORBA
Többszörös öröklıdés az interfészek között Az interfészeket IDL nyelven írja le A kliens a klienscsonkon keresztül használja az objektumot RPC alapú kliensszerver kommunikáció
13
14
SCM: Service Control Modul
Példa
[object, uuid(3CFDB283-CCC5-11D0-BA0B-00A0C90DF8BC), helpstring("IMatrix1 Interface"), pointer_default(unique)]
Mátrix szerver
Interfészek (IMatrix1)
Egész mátrix (kétdimenziós tömb)
Nézetek: 1.
2.
interface IMatrix1 : IUnknown { import "unknwn.idl";
Matrix1 Set() és Get() mőveletekkel állítható/lekérdezhetı a mezık tartalma
HRESULT get([in] SHORT n, [in] SHORT m, [out] LONG *value); HRESULT set([in] SHORT n, [in] SHORT m, [in] LONG value);
Matrix2
};
Reset() mővelettel megadott értékkel tölthetı fel a teljes mátrix 15
16
Interfészek
Type Library
[object, uuid(3CFDB284-CCC5-11D0-BA0B-00A0C90DF8BC), helpstring("IMatrix2 Interface"), pointer_default(unique)]
[uuid(3CFDB281-CCC5-11D0-BA0B-00A0C90DF8BC), version(1.0), helpstring(„matrix 1.0 Type Library)] library MATRIXLib { importlib("stdole32.tlb");
interface IMatrix2 : IUnknown { import "unknwn.idl";
[uuid(3CFDB287-CCC5-11D0-BA0B-00A0C90DF8BC), helpstring("Matrix Class")]
HRESULT reset([in] LONG value);
coclass CMatrix { [default] interface IMatrix1; interface IMatrix2; };
};
}; 17
18
3
Osztálydefiníció (cmatrix.h)
Impementáció
#include ”matrix.h” // IDL-bıl generál header
#include "cmatrix.h"
class CMatrix : public IMatrix1, public IMatrix2 { public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP CMatrix::QueryInterface(REFIID riid, void** ppv) { if (riid == IID_IUnknown || riid == IID_IMatrix1) *ppv = (IMatrix1*) this; else if (riid == IID_IMatrix2) *ppv = (IMatrix2*) this; else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return S_OK; }
// IMatrix1 STDMETHODIMP get(IN SHORT n, IN SHORT m, OUT LONG *value); STDMETHODIMP set(IN SHORT n, IN SHORT m, IN LONG value); // IMatrix2 STDMETHODIMP reset(IN LONG value); …
// create/destroy mőveletek és privát deklarációk
};
19
20
Implementáció
Implementáció
STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&m_cRef); }
STDMETHODIMP CMatrix::get(IN SHORT n, IN SHORT m, OUT LONG* value) { *value = m_a[n][m]; return S_OK; }
STDMETHODIMP_(ULONG) Release(void) { if (InterlockedDecrement(&m_cRef) == 0) { delete this; return 0; } return 1; }
…
// többi mővelet
extern HANDLE hevtDone; CMatrix::~CMatrix() { for (int i=0; i < m_height; i++) delete[] m_a[i]; delete[] m_a; SetEvent(hevtDone); } 21
22
Szerver
Kliens
HANDLE hevtDone;
#include „matrix.h"
void main() { hevtDone = CreateEvent(NULL, FALSE, FALSE, NULL); // esemény hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
void main(int argc, char**argv) { IMatrix1 *pIMatrix1; IMatrix2 *pIMatrix2; LONG value;
CClassFactory* pcf = new CClassFactory; hr = CoRegisterClassObject(CLSID_CMatrix, pcf, CLSCTX_SERVER, REGCLS_MULTIPLEUSE , &dwRegister); WaitForSingleObject(hevtDone, INFINITE); CloseHandle(hevtDone); CoUninitialize();
CoInitialize(NULL); CoCreateInstance(CLSID_CMatrix, NULL, CLSCTX_SERVER, IID_IMatrx1, (void**) &pIMatrix1);
// várakozás az eseményre pIMatrix1->get(0, 0, &value); pIMatrix1->QueryInterface(IID_IMatrix2, (void**) &pIMatrix2); pIMatrix1->Release(); pIMatrix2->reset(value + 1); pIMatrix2->Release();
}
23
CoUninitialize();
24
}
4
CORBA (Interfészek)
CORBA (Osztálydefiníció)
interface matrix1 { long get(in short n, in short m); void set(in short n, in short m, in long value); };
#include ”matrix.h” // IDL-bıl generált header class matrix_i : public MatrixBOAImpl { public: virtual CORBA::Long get(CORBA::Short n, CORBA::Short m, CORBA::Environment &env); virtual void set(CORBA::Short n, CORBA::Short m, CORBA::Long value, CORBA::Environment &env);
interface matrix2 { void reset(in long value); };
virtual void reset(CORBA::Long value, CORBA::Environment &env); matrix_i(CORBA::Short h, CORBA::Short w); virtual ~martix_i();
interface matrix : matrix1, matrix2 { };
private: CORBA::Long **m_a; CORBA::Short m_height, m_width; 25
};
26
CORBA (Implementáció)
CORBA (Szerver)
#include ”matrix_i.h”
int main() { matrix_i ourMatrix(100,100);
CORBA::Long matrix_i::get(CORBA::Short n, CORBA::Short m, CORBA::Environment &) { return m_a[n][m]; }
try { CORBA::Orbix.impl_is_ready(„matrix"); } catch (...) { cout << "Unexpected exception" << endl; exit(1); }
void matrix_i::reset(CORBA::Long value, CORBA::Environment &) { short n, m; for (n = 0; n < m_height; n++) for (m = 0; m < m_width; m++) m_a[n][m]=value; return; } …
// egyéb mőveletek
}
27
CORBA (Kliens)
28
Irodalom
#include „matrix.h"
void main (int argc, char **argv) { matrix_var matrixVar;
CORBA::Long value;
matrixVar = matrix::_bind(":matrix");
value = matrixVar->get(0, 0); matrixVar->reset(value + 1); }
29
http://www.wikipedia.org http://msdn2.microsoft.com/enus/library/ms809340.aspx http://www.infosys.tuwien.ac.at/Staff/tg/Teac hing/UniZH/CBSE/slides/lecture11.pdf http://lass.cs.umass.edu/~shenoy/courses/s pring07/lectures/Lec25.pdf data.uta.edu/~ramesh/cse5306/DCOMCom parison.ppt 30
5