Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Komponentowe systemy rozproszone

Podobne prezentacje


Prezentacja na temat: "Komponentowe systemy rozproszone"— Zapis prezentacji:

1 Komponentowe systemy rozproszone
COM i inni

2 Komunikacja/komponenty w WINDOWS w ujęciu historycznym
Schowek DDE 16-bitowe OLE 1.0 16-bitowe OLE 2.0 OLE 2.0 = COM = ActiveX 32-bitowe OLE Dcom COM+ = COM + MTS + MSMQ

3 Component Object Model
Binarny standard komunikacji Nie jest językiem Nie wymaga konketnego języka Niezależny od języka Zarządzanie zasobami Interfejsy – standard komunikacji Identyfikacja obiektów i usług (Pół)Automatyczne metody marszalingu danych Wspiera: enkapsulację, dziedziczenie interfejsu i implementacji, polimorfizm

4 Obiektowy model klient - serwer

5 Rodzaje serwerów COM serwer w procesie = biblioteka dynamiczna InprocServer / InprocServer32 serwer lokalny = oddzielny proces wykonywalny lokalnie LocalServer / LocalServer32 serwer zdalny = proces wykonywalny zdalnie RemoteServer / RemoteServer32

6 COM – zarządzanie obiektem
Zarządzanie pamięcią czas życia - zliczanie referencji zarządzanie kopiami danych przekazywanymi między obiektami Zunifikowany sposób tworzenia / likwidowania

7 COM – identyfikacja klas
GUID - globalnie unikalny identyfikator: 128-bitowa liczba np.: B77D61E0-47D8-11d0-B53F CLSID - GUID identyfikujący klasę obiektu IID - GUID identyfikujący interfejs (niezbędny gdy mamy do czynienia z marszalingiem danych) Generowanie GUID: przez użytkownika - GUIDGEN.EXE, UUIDGEN.EXE Przez środowisko np .NET, VB, VC++ przez API - funkcja CoCreateGuid

8 Tworzenie obiektów Indywidualna funkcja tworzaca obiekty
CoCreateObject() – wymaga dostarczenia IClassFactory

9 "Ręczne " tworzenie COM-a – InProcess
DllGetClassObject(CLSID_Test, IID_IClassFactory, (void**)pClassFactory); pClassFactory->CreateInstance( NULL, IID_Test, (void**)pTest); pClassFactory->Release();

10 Klient COM class ComClientClass { ... virtual DoSmthg(int);
} * pInterface; Klient COM if (! FAILED(CoInitialize(NULL))) { err = (CoCreateInstance(CLSID_TESTCLASS, NULL, CLSCTX_INPROC_SERVER, IID_TESTINTERFACE, (void **)&pInterface) ); //użycie COM-a pInterface->DoSmthg(5); //zwolnienie COM-a pInterface->Release(); CoUninitialise(); } CLSCTX_ALL CLSCTX_INPROC_SERVER CLSCTX_LOCAL_SERVER

11 Powiązanie obiektu z serwerem
systemowa baza danych (rejestr systemu) - REGEDIT.EXE: HKEY_CLASSES_ROOT CLSID {GUID klasy obiektu} = Opis klasy obiektu ProgID = Producent.Serwer.Wersja VersionIndependentProgID = Producent.Serwer RodzajSerwera = Pełna nazwa (ze ścieżką) Insertable Producent.Serwer.Wersja = Opis klasy obiektu CLSID = {GUID klasy obiektu} Producent.Program = Opis klasy obiektu (bez wersji) CurVer = Producent.Serwer.Wersja funkcje: ProgIDFromCLSID  CLSIDFromProgID

12 Rejestracja COM-a ”ręczne” uruchomienie pliku typu .REG
automatyczny import pliku .REG bezpośrednia manipulacja rejestrem obsługa /REGISTER i /UNREGISTER

13 COM - interfejsy Koncepcja interfejsu:
kontrakt na realizację pakietu usług niezależny od języków programowania sposób opisu: IDL Biblioteki typów TLB odpowiednik tablicy wskaźników do funkcji: C, C++, Pascal Java VB

14 Realizacja interfejsu w C++
class CBeeper: CUnknown { public: // wysokość dźwięku long m_lSound ; // wydanie dźwięku long GetSound (); void SetSound (long lSound); long Beep () ; } ptr = CoCreateInstance(....) ; (CBeeper)ptr->Beep(); interface IBeeper : IUnknown { long GetSound (); void SetSound (long lSound); long Beep () ; };

15 Realizacja interfejsu w C++

16 Interfejsy HKEY_CLASSES_ROOT CLSID {a123x3y1-4ce6-4ce6-4ce6-2a } = My Prog Proxy = Ole2.dll InprocServer32 = c:\\coms\\myserver.dll LocalServer32 = c:\\coms\\myserver.exe {x ce6-4ce6-4ce6-2a } InprocServer32 = c:\\coms\\mystub.dll Interface {a123x3y1-4ce6-4ce6-4ce6-2a } NumMethods BaseInterface ProxyStubClsId = {x ce6-4ce6-4ce6-2a }

17 Skrypt IDL Język opisu interfejsów MIDL.EXE – kompilacja IDL do:
[uuid(108dbc1b-1ad2-4bda-b45a-e6b0f014c3a1),object] interface IMKInterface : IUnknown { import "unknwn.idl"; HRESULT TransformTxt([in,out,string]char *file); HRESULT GetMaxLen([out]WORD *dw); HRESULT SetMaxLen([in] WORD dw); } MIDL.EXE – kompilacja IDL do: biblioteki typów zrodla w c dla stub-a (dll) szeregującego

18 Biblioteka typów Może być linkowana jako zasób lub dostępna oddzielnie: HKEY_CLASSES_ROOT CLSID {a123x3y1-4ce6-4ce6-4ce6-2a } = My Prog ProgID = Producent.Serwer.Wersja TypeLib = {a123x3y1-4ce6-4ce6-4ce6-a } TypeLib {a123x3y1-4ce6-4ce6-4ce6-a } = My Type Lib Dir = c:\tmp HelpDir = c:\tmp\Help = Any.TLB = English.TLB

19 IUnknown - podstawowy interfejs obiektu
każdy obiekt odostępnia interfejs IUnknown każdy interfejs obejmuje (dziedziczy) IUnknown

20 Właściwości Interfejsów
Statyczny (niezmienny w czasie) zestaw interfejsów Jednoznaczny i unikatowy IUnknown dla różnych obiektów Zada zwrotności: IA -> IA Zasada symetrii: IA -> IB -> IA Zasada przechodniości: IA -> IB -> IC i IA -> IC

21 IUnknown - funkcjonalność
interface IUnknown { // zwiększa licznik odniesień ULONG AddRef () ; // zmniejsza licznik odniesień, // gdy licznik == 0 to zwalnia obiekt ULONG Release () ; // udostępnia interfejsy do obiektu HRESULT QueryInterface ( REFIID riid, // identyfikator interfejsu void** ppvObj) ; // wskaźnik do zwracanego interf. } ;

22 IUnknown – realizacja w C++
class IUnknown { public: virtual HRESULT QueryInterface (REFIID, void**) ; virtual ULONG AddRef () ; virtual ULONG Release () ; } ; STDMETHODIMP QueryInterface (REFIID, void**) ; STDMETHODIMP_(ULONG) AddRef () ; STDMETHODIMP_(ULONG) Release () ; } ; Makra MFC

23 Zliczanie odniesień Tworzenie kopii odniesienia do obiektu – AddRef
Unieważnienie odniesienia do obiektu – Release W praktyce AddRef / Release Zwrot referencji przez funkcję Przekazanie odniesienia do oddzielnego wątku

24 Zarządzanie obiektami przez zliczanie odniesień
class CXxxObject : public IUnknown { public: CXxxObject (…): m_cRef (0) {…} ; virtual HRESULT QueryInterface (REFIID, void**) ; virtual ULONG AddRef () ; virtual ULONG Release () ; … private: ULONG m_cRef ; // licznik odniesień … } ;

25 IUnknown::AddRef / Release
ULONG CXxxObject::AddRef () { return ++m_cRef; // licznik odniesień } ULONG CXxxObject::Release () { if (0 != --m_cRef) // licznik odniesień return m_cRef ; delete this ; // usunięcie obiektu return 0 ;

26 IUnknown::QueryInterface
HRESULT CXxxObject::QueryInterface ( REFIID riid, void** ppvObj) { *ppvObj = NULL ; if ( IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IMyInterface) ) // if (riid == IID_IUnknown || riid == IID_IMyInterface) *ppvObj = this ; if (NULL != *ppvObj) { ((IUnknown)*ppvObj)->AddRef (); //licznik odniesień return NOERROR ; } else return E_NOINTERFACE; }

27 IClassFactory - tworzenie obiektów
interface IClassFactory : public IUnknown { // stworzenie obiektu HRESULT CreateInstance( IUnknown* pUnkOuter, // wskaźnik do obiektu nadrzęd REFIID riid, // podstawowy interfejs obiektu void** ppvObj) ; // wskaźnik do zwracanego interf. // zablokowanie serwera w pamięci HRESULT LockServer( BOOL fLock ); } ;

28 Realizacja wielu interfejsów?
Techniczny problem w przypadku realizacji interfejsów jako oddzielnych klas pot. problem z powolywaniem do zycia i zarzadzanie wieloma POWIĄZANYMI obiektami możliwe rozwiązanie: klasy zagnieżdzone MFC – BEGIN/END_INTERFACE_PART metody z IUnknown są delegowne do klasy głównej

29 Implementacja ClassFactory
class CXxxObject ; // klasa tworzonych obiektów class CXxxClassFactory : public IClassFactory { public: // IUnknown STDMETHODIMP QueryInterface (REFIID, void**) ; STDMETHODIMP_(ULONG) AddRef () ; STDMETHODIMP_(ULONG) Release () ; // IClassFactory STDMETHODIMP CreateInstance ( IUnknown*, REFIID, void**) ; STDMETHODIMP LockServer (BOOL) ; private: … } ;

30 IClassFactory::CreateInstance
STDMETHODIMP CXxxClassFactory::CreateInstance ( IUnknown* pUnkOuter, REFIID riid, void** ppvObj) { *ppvObj = NULL ; if (NULL != pUnkOuter) // obiekt nie wspiera agregacji return ResultFromScode(CLASS_E_NOAGGREGATION); // stworzenie obiektu CXxxObject pObj = new CXxxObject ; // udostepnienie żądanego łącza HRESULT hr = pObj->QueryInterface (riid, ppvObj) ; if (FAILED (hr)) delete pObj ; else *ppvObj = pObj ; return hr ; }

31 IClassFactory MFC DECLARE_OLECREATE(klasa) IMPLEMENT_OLECREATE(klasa,”identyfikator”,id_lo ng1, id_word2, id_word3, id_byte4, id_byte5 …) DECLARE_DYNCREATE(klasa) IMPLEMENT_DYNCREATE(klasa, klasa_bazowa)

32 Serwer w procesie (in-process)
biblioteka dynamiczna udostępniająca funkcje: STDAPI DllGetClassObject ( REFCLSID rclsid, // GUID klasy udostępnianych obiektów REFIID riid, // GUID łącza tworzącego obiekty // (zwykle IID_ClassFactory) void** ppv) ; // wskaźnik do zwracanego łącza STDAPI DllCanUnloadNow () ;

33 Funkcje serwera typu InProcess
STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,void**ppv) { if (rclsid != CLSID_XXX) return ResultFromScode (E_FAIL) ; CXxxClassFactory* pObj = new CXxxClassFactory ; if (pObj == NULL) return ResultFromScode (E_OUTOFMEMORY); HRESULT hr = pObj->QueryInterface (riid, ppv) ; if (FAILED (hr)) delete pObj ; return hr; } STDAPI DllCanUnloadNow () { SCODE sc = (/*czy są obiekty? */…) ? S_FALSE : S_OK ; return ResultFromScode (sc);

34 Klient COM Server COM CoCreateInstance CLSID {123434-23213-2323-4234}
InprocServer32 = “test.dll” CoGetClassObject ReadRegistry CoLoadLibrary(“test.dll”,TRUE) Hmodule = LoadLiibrary(test.dll) DllMain GetProcAdress(hModule, ”DllGetClassObject”) DllGetClassObject DllGetClassObject pFactory->QueryInterface pFactory->AddRef pFactory->CreateInstance pFactory-> CreateInstance pObject->QueryInterface pObject->AddRef pFactory->Release pFactory->Release

35 Serwer lokalny program wykonywalny rejestrujący udostępniane obiekty:
zagadnienia utrzymanie programu w pamięci dopóki istnieją obiekty pot. różny wygląd w zależności od typu pracy (/embeeded) STDAPI CoRegisterClassObject( REFCLSID rclsid, // GUID klasy obiektów IUnknown * pUnk, // Interfejs IUnknown // udostępnianego obiektu DWORD dwClsCtxt, // Rodzaj serwera DWORD flags, // Sposób nawiązywania połączenia DWORD** pdwReg // Wskaźnik do zarejestrowanej klasy );  

36 Inicjalizacja i zakończenie serwera lokalnego
// inicjalizacja if (FAILED (CoInitializeEx (NULL))) … // błąd inicjalizacji CXxxClassFactory* pClassFact = new CXxxClassFactory ; pClassFact->AddRef () ; DWORD dwReg ; if (FAILED (CoRegisterClassObject(CLSID_XXX, pClassFact,CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwReg)) ) // zakończenie CoRevokeClassObject (dwReg) ; pClassFact->Release () ; CoUninitializeEx () ;

37 COM – marszaling danych między procesami
Wymagane jest zarejestrowanie interfejsów

38 Interfejsy HKEY_CLASSES_ROOT CLSID {a123x3y1-4ce6-4ce6-4ce6-2a } = My Prog Proxy = Ole2.dll InprocServer32 = c:\\coms\\myserver.dll LocalServer32 = c:\\coms\\myserver.exe {x ce6-4ce6-4ce6-2a } InprocServer32 = c:\\coms\\mystub.dll Interface {a123x3y1-4ce6-4ce6-4ce6-2a } NumMethods BaseInterface ProxyStubClsId = {x ce6-4ce6-4ce6-2a }

39 Wielokrotne wykorzystywanie (reusability) kodu
C++ dziedziczenie wspólne pola danych dla klasy podstawowej i pochodnej wymaga bardzo dokładnego dokumentowania, zwykle przez udostępnianie kodu źródłowego COM zawieranie obiektów agregacja obiektów

40 Zawieranie obiektów modyfikacja metod obiektu
obiekt zewnętrzny nie udostępnia łącza IUnknown obiektu wewnętrznego obiekt zewnętrzny udostępnia pośrednio wybrane łącza obiektu wewnętrznego

41 Zawieranie obiektów - zewnętrzny obiekt
class CExtObject : IUnknown, IInterfaceW, IInterfaceZ { public: CExtObject (…): m_pInObj (NULL) { ::CoCreateInstance (CLSID_ExtObject, NULL, CLSCTX_ALL, IID_IUnknown, &m_pInObj) ; } ; ~CExtObject () { Release();delete m_pInObj; } ; … // metody łącz IInterfaceZ i IInterfaceW private: IUnknown* m_pInObj ; // obiekt wewnętrzny … } ;

42 Agregacja obiektów udostępnienie niezmienionych metod obiektu
obiekt zewnętrzny udostępnia pośrednio łącze IUnknown obiektu wewnętrznego obiekt zewnętrzny udostępnia bezpośrednio pozostałe łącza obiektu wewnętrznego

43 Agregacja - wewnętrzny obiekt
class CInObject : IUnknown, IInterfaceW { public: CInObject (IUnknown* pUnkOuter, …) ; virtual HRESULT QueryInterface (REFIID, void**) ; virtual ULONG AddRef () ; virtual ULONG Release () ; … private: ULONG m_cRef ; // licznik odniesień IUnknown *m_pUnkOuter ; // zewnętrzne IUnknown … } ;

44 Agregacja – zliczanie odniesień
CInObject:: CInObject(IUnknown* pUnkOuter, …) m_cRef (0), m_pUnkOuter (pUnkOuter) { … } ULONG CInObject::AddRef () { if (m_pUnkOuter) return m_pUnkOuter->AddRef () ; return ++m_cRef ; } ULONG CInObject::Release () { if (m_pUnkOuter) return m_pUnkOuter->Release () ; if (0 != --m_cRef) return m_cRef ; delete this ; return 0 ;

45 Agregacja - QueryInterface
HRESULT CInObject::QueryInterface ( REFIID riid, void** ppvObj) { *ppvObj = NULL ; if (m_pUnkOuter) return m_pUnkOuter->QueryInterface(riid, ppvObj); if (IsEqualIID (riid, IID_IUnknown) || IsEqualIID (riid, IID_IInterface1)) *ppvObj = this ; if (NULL != *ppvObj) { ((LPUNKNOWN)*ppvObj)->AddRef () ; return NOERROR ; } return ResultFromScode (E_NOINTERFACE) ; }

46 Agregacja – CreateInstance
HRESULT CInClassFactory::CreateInstance ( IUnknown* pUnkOuter, REFIID riid, void** ppvObj) { *ppvObj = NULL ; if (pUnkOuter && riid != IID_IUnknown) return ResultFromScode (E_NOINTERFACE); CInObject pObj = new CInObject (pUnkOuter, …) ; HRESULT hr = pObj->QueryInterface (riid, ppvObj) ; if (FAILED (hr)) delete pObj ; else *ppvObj = pObj ; return hr ; }

47 Emulacja i wersjonowanie
HKEY_CLASSES_ROOT MyFirm.MyProg = this is current version of component CLSID = {a123x3y1-4ce6-4ce6-4ce6-2a } CurVer = {a123x3y1-4ce6-4ce6-4ce6-2a } MyFirm.MyProg.1= this is version 1 of component CLSID = {x000x0y0-4ce6-4ce6-4ce6-2a } MyFirm.MyProg.2 = this is version 2 of component CLSID = {a123x3y1-4ce6-4ce6-4ce6-2a } TreatAs = {y ce6-4ce6-4ce6-2a } AutoTreatAs = {y ce6-4ce6-4ce6-2a } funkcje: CoTreateAsClass

48 ActiveX Kontrolki, Serwery
Kontrolki ActiveX: standard do rozszerzania zestawu pól dialogowych dostępnych w systemie Windows poprzednie standardy: Custom Controls, Visual Basic Controls OCX = ActiveX (OLE controls = ActiveX controls) gotowe komponenty funkcjonalne do budowania programów Server ActiveX: program udostępniający IDispatch

49 Realizacja interfejsu IDispatch w C++
interface IDispatch : IUnknown { HRESULT GetTypeInfoCount (…) ; HRESULT GetTypeInfo (…) ; HRESULT GetIDsOfNames (…) ; HRESULT Invoke (DISPID dispID, REFIID riid, LCID lcid, unsigned short wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr) ; } ;

50 Implementacja klienta automatyzacji - Visual Basic
Dim ThisExcel As Excel.Application Dim ThisChart As Excel.Chart Private Sub Command1_Click() Timer1.Enabled = Not Timer1.Enabled If Timer1.Enabled Then Command1.Caption = "&Pause Chart Turning" Else Command1.Caption = "&Resume Chart Turning" End If End Sub Private Sub Timer1_Timer() Static iRotate With ThisChart .Rotation = iRotate End With iRotate = (iRotate + 5) Mod 360

51 Private Sub Form_Load()
Dim TitleArray As Variant Dim DataArray As Variant TitleArray = Array("Dogs", "Cats", "Horses") DataArray = Array(34, 53, 12) Set ThisExcel = CreateObject("Excel.application") With ThisExcel .Workbooks.Add .Range("A1:C1").Value = TitleArray .Range("A2:C2").Value = DataArray .Range("A1:C2").Select Set ThisChart = .Charts.Add() .Visible = True End With With ThisChart .Type = Excel.Constants.xl3DColumn .HasLegend = False End With Command1_Click End Sub

52 Implementacja klienta automatyzacji – C++
CExcelApplication * app = new CExcelApplication(.....); //app-> Attach(....); App-> Workbooks.Add();

53 Dedykowany klient automatyzacji
MFC/.Net potrafią wygenerować klasę udostępniającą funkcjonalność obiektu ActiveX na postawie: biblioteki TLB (również np. wkompilowanej w dll) zawartości rejestru (ID.klasy) klasa pośredniczy w wołaniu metod serwera dostępie do pól udostepnianych przez serwer (Get/Set) CMyComClassDriver c; c.CreateDispatch(ComObjectCLSID); x = c.Calculate(15); c.ReleaseDispatch();

54 Klient automatyzacji - VC++
CLSID clsid; IDispatch* pIDispatch ; ::CLSIDFromProgID(T2OLE(_T("Excel.application")),&clsid); HRESULT hr = ::CoCreateInstance (clsid, NULL, CLSCTX_SERVER, IID_IDispatch, (void**) &pIDispatch); CApplication m_pThisExcel = new CApplication (pIDispatch) ; CChart*m_pThisChart = new CChart(CCharts(m_pThisExcel->Charts ()).Add ()); CRange( m_pThisExcel->Range("A1", "C1")).SetValue(TitleArray); CRange (m_pThisExcel->Range ("A1", "C2")).Select () ; m_pThisExcel->SetVisible (TRUE) ; m_pThisChart->SetRotation (iRotate) ;

55 IDispatch z perspektywy klienta
Informacje o interfejsie ? IDispatch – samodokumentujacy się interfejs Biblioteka typów: Pliki .TLB Wbudowana w komponent (jako zasób) Sterowniki: VC++ - ClassWizard - dedykowana klasa (na podst. biblioteki typów) VB – import komponentu lub biblioteki

56 Właściwości interfejsu IDispatch
Zalety: Samodokumentowanie się interfejsów Możliwość późnego wiązania Wady: Zła efektywność Praktyczne realizacje: Dwa zestawy interfejsów Interfejsy dualne (IDL: dual, HRESULT)

57 IDispatchEx Zmienione zestawy parametrów
Dynamiczna zmiana udostępnianej funkcjonalności interface IDispatchEx: IDispatch { GetDispID(...); GetNextDispID(...); InvokeEx(...); DeleteMemberByName(...); DeleteMemberByDispID(...); GetMemberProperties(...); GetMemberName(...); GetNameSpaceParent(...); };

58 Obsługiwane typy danych
IDL: boolean(bool), double, float, signed int(int/long), signed short(short), enum, BSTR, CY, DATE, IDispatch*, IUnknown*, SAFEARRAY, VARIANT

59 Variant struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; // = VT_I4, VTUI1, VT_I WORD wReserved1, wReserved2, wReserved3; union { LONG lVal; // VT_I4 BYTE bVal; // VT_UI1 SHORT iVal; // VT_I2 FLOAT fltVal; // VT_R4 DOUBLE dblVal; // VT_R8 CY cyVal; // VT_CY DATE date; // VT_DATE BSTR bstrVal; // VT_BSTR IUnknown punkVal; // VT_UNKNOWN } } };

60 Variant Funkcje usługowe: VariantChangeType(Ex) VariantClear
VariantCopy VariantCopyInd VariantInit

61 BSTR Tablica znakowa (UNICODE) zakończona terminatorem i poprzedzona długością (przed miejscem określonym przez wskaźnik) VB, Java Funkcje usługowe C++: SysAllocString, SysAllocStringByteLen SysAllocStringLen SysFreeString SysReAllocString, SysReAllocStringLen SysStringByteLen, SysStringLen

62 SAFEARRAY typedef struct tagSAFEARRAY { USHORT cDims; // liczba wymiarów USHORT cFeatures; // znaczniki ULONG cbElements; // rozmiar elementu ULONG cLocks; // licznik rygli PVOID pvData; // dane tablicy SAFEARRAYBOUND rgsabound[]; // tablica dla każdego wymiaru } SAFEARRAY;

63 SAFEARRAY SafeArrayAllocData, SafeArrayAllocDescriptor, SafeArrayCreate(Ex), SafeArrayCreateVector(Ex), SafeArrayDestroy, SafeArrayDestroyData, SafeArrayDestroyDescriptor, SafeArrayAccesData, SafeArrayUnaccesData, SafeArrayLock, SafeArrayUnlock SafeArrayCopy, SafeArrayCopyData SafeArrayGetDim, SafeArrayRedim, SafeArrayPtrOfIndex, SafeArrayGetLBound, SafeArrayGetUBound, SafeArrayGetElement, SafeArrayGetElemsize SafeArrayPutElement, SafeGetVartype, SafeArrayGetIID, SafeArraySetIID SafeArrayGetRecordInfo, SafeArraySetRecordInfo

64 Refleksja Możliwość odpytywania o typ, metody i pola obiektów w czasie działania Mozliwość budowy wołań do metod w czasie działania Standardowy zestaw atrybutów odczytywalnych w czasie działania opisujących własności metod i pól (np. serializacja) Możliwość stosowania dodatkowych atrybutów (np. Informacji konfiguracyjnych)

65 COM wiecznie żywy

66 Runtime Callable Wrapper
Współpraca z COM Runtime Callable Wrapper Natywny COM Server Klient .Net IUnknown IDispatch IFoo RCW jest generowany przez runtime

67 Współpraca z COM Object name klient COM Obiekt .Net IUnknown IDispatch
IFoo IFoo Regasm.exe pozwala wygenerować GUID i zaktualizować wpisy w rejestrze.

68 Serwer Com w .NET Rejestracja: regasm.exe
using System.Runtime.InteropServices; using System.Reflection; [GuidAttribute("EA5A0174-D a-8B9B-28F6674E9371"), ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IKlasaN { uint SetState(int state); uint GetState(out int state); } [ClassInterface(ClassInterfaceType.None), GuidAttribute("493DEA38-15EB-4acf CF32A29F3"), ComVisible(true), ProgId(„comtestnet.klasa.1”)] public class KlasaN: IKlasaN { ... Rejestracja: regasm.exe


Pobierz ppt "Komponentowe systemy rozproszone"

Podobne prezentacje


Reklamy Google