Tartalom D Szoftvertechnológia elıadás Architektúra D vs CORBA Példá 2 1987 Dynamic Data Exchange (DDE) Windows 2.0-ban Windows alkalmazások közötti adatcsere Ma is használatos (pl. vágólap) NetDDE NetBIOS protokol felett Windows XP-ig használatos (pl. Fekete Macska) A Windows Vista már nem tartalmazza 1990 Object Linking and Embedding (OLE 1.0) Üzenetek helyett dokumentum-megosztás (Virtual Function Table VTBL) Windows 3.0 1993 Component Object Model () 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 elnevezést 3 4 1993 OLE 2.0 alapú implementáció Windows 3.1 1994 OLE Custom Controls OLE 2.0-t támogató tárolókba ágyazhatók 1996-tól ActiveX Hálózati megosztása a dokumentumoknak + Windows NT SP 4.0 Új esemény-modell 1997 Distributed Component Object Model (D) 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 5 6 1
D Platform-független Minden olyan operációs rendszerben mőködik, amely nyújt D támogatást Windows, Unix, Macintosh Nyelv-független C++, VJ++, Delphi Átviteli mód-független TCP/IP, UDP. IPX/SPX, NetBIOS, AppleTalk Objektum-model Interfész Platform-független Nyelv-független Microsoft Interface Definition Language (IDL) Lefordítható a szükséges programozási nyelvre Platform-specifikus Számos nyelven készülhet (C, C++, Delphi stb.) 7 8 Használat (folyamaton belül) 1. Megosztandó objektum elkészítése Interfész(ek) Proxy 2. Proxy objektum és az interfészek eljuttatása a felhasználói oldalra 3. Proxy és interfészek regisztrációja Regisztrációs adatbázisban (registry) A innen olvassa ki az objektum elérhetıségét (a tároló szerver címét) 4. Az interfész lefordítása a használt nyelvre 5. Az objektum felhasználása a programunkban Hatékony Nincs szükség az ORB-re Nincs hálózati kommunikáció 9 10 (folyamatok között) (távolról) LPC LPC Stabil Local Procedure Call (LPC) technológiával Hálózat 11 12 2
(D) D vs CORBA Registry OLE SCM D network protocol SCM Registry D 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 Interfészek (IMatrix1) Mátrix szerver Egész mátrix (kétdimenziós tömb) Nézetek: 1. Matrix1 Set() és Get() mőveletekkel állítható/lekérdezhetı a mezık tartalma 2. Matrix2 Reset() mővelettel megadott értékkel tölthetı fel a teljes mátrix [object, uuid(3cfdb283-ccc5-11d0-ba0b-00a0c90df8bc), helpstring("imatrix1 Interface"), pointer_default(unique)] interface IMatrix1 : IUnknown import "unknwn.idl"; ; HRESULT get([in] SHORT n, [in] SHORT m, [out] LONG *value); HRESULT set([in] SHORT n, [in] SHORT m, [in] LONG value); 15 16 Interfészek Type Library [object, uuid(3cfdb284-ccc5-11d0-ba0b-00a0c90df8bc), helpstring("imatrix2 Interface"), pointer_default(unique)] interface IMatrix2 : IUnknown import "unknwn.idl"; ; HRESULT reset([in] LONG value); [uuid(3cfdb281-ccc5-11d0-ba0b-00a0c90df8bc), version(1.0), helpstring( matrix 1.0 Type Library)] library MATRIXLib importlib("stdole32.tlb"); ; [uuid(3cfdb287-ccc5-11d0-ba0b-00a0c90df8bc), helpstring("matrix Class")] 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 class CMatrix : public IMatrix1, public IMatrix2 public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // 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); #include "cmatrix.h" 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; ; // 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_(ULONG) Release(void) if (InterlockedDecrement(&m_cRef) == 0) delete this; return 0; return 1; STDMETHODIMP CMatrix::get(IN SHORT n, IN SHORT m, OUT LONG* value) *value = m_a[n][m]; return S_OK; // 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 HANDLE hevtdone; void main() hevtdone = CreateEvent(NULL, FALSE, FALSE, NULL); // esemény hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); CClassFactory* pcf = new CClassFactory; hr = CoRegisterClassObject(CLSID_CMatrix, pcf, CLSCTX_SERVER, REGCLS_MULTIPLEUSE, &dwregister); WaitForSingleObject(hevtDone, INFINITE); CloseHandle(hevtDone); CoUninitialize(); // várakozás az eseményre #include matrix.h" void main(int argc, char**argv) IMatrix1 *pimatrix1; IMatrix2 *pimatrix2; LONG value; CoInitialize(NULL); CoCreateInstance(CLSID_CMatrix, NULL, CLSCTX_SERVER, IID_IMatrx1, (void**) &pimatrix1); 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); ; interface matrix2 void reset(in long value); ; interface matrix : matrix1, matrix2 ; 25 #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); virtual void reset(corba::long value, CORBA::Environment &env); matrix_i(corba::short h, CORBA::Short w); virtual ~martix_i(); private: CORBA::Long **m_a; CORBA::Short m_height, m_width; ; 26 CORBA (Implementáció) CORBA (Szerver) #include matrix_i.h CORBA::Long matrix_i::get(corba::short n, CORBA::Short m, CORBA::Environment &) return m_a[n][m]; 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; int main() matrix_i ourmatrix(100,100); try CORBA::Orbix.impl_is_ready( matrix"); catch (...) cout << "Unexpected exception" << endl; exit(1); // egyéb mőveletek 27 28 CORBA () 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); 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/dcom parison.ppt 29 30 5