Obiekty w plikach wykonywalnych, marshaling

Podobne dokumenty
Droga do DCOM DCOM (1996) Windows clipboard (1987) OLE 1 DDE (1992) OLE 2 (1993) COM (1995) Distributed computing (1980s)

Tworzenie aplikacji rozproszonej w Sun RPC

Microsoft Interface Definition Language

76.Struktura oprogramowania rozproszonego.

Programowanie współbieżne i rozproszone

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Zdarzenia (events, connection points)

Wywoływanie metod zdalnych

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wywoływanie metod zdalnych

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Komunikacja i wymiana danych

Aplikacje RMI

InsERT GT Własne COM 1.0

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Structured storage, Monikers, Running Object Table

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Technologie COM i ActiveX COM - Component Object Model

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Interfejs IUnknown. Każdy obiekt COM musi implementować interfejs IUnknown, który zawiera trzy metody:

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Michał Jankowski. Remoting w.net 2.0

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy programowania skrót z wykładów:

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Remote Method Invocation 17 listopada 2010

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Sun RPC/XDR. Dariusz Wawrzyniak 1

Podejście obiektowe do budowy systemów rozproszonych

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie obiektowe

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

external Data Representation

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

Zdalne uruchamianie obiektów COM

// LISTING #2 DRUGIE PODEJŚCIE

Wykład 4: Klasy i Metody

Microsoft IT Academy kurs programowania

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Szablony klas, zastosowanie szablonów w programach

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

PARADYGMATY PROGRAMOWANIA Wykład 4

Serwery Statefull i Stateless

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Wprowadzenie do szablonów szablony funkcji

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Szablony funkcji i szablony klas

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Wprowadzenie. Dariusz Wawrzyniak 1

Programowanie składnikowe. Programowanie składnikowe w modelu COM. COM - Component Object Model. wprowadzenie. Programowanie składnikowe

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Kurs OPC S7. Spis treści. Dzień 1. I OPC motywacja, zakres zastosowań, podstawowe pojęcia dostępne specyfikacje (wersja 1501)

Wprowadzenie do szablonów szablony funkcji

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Wywoływanie procedur zdalnych

Aplikacje RMI Lab4

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Biuletyn techniczny. CDN OPT!MA 12.0 Drukarki fiskalne w usługach terminalowych. Copyright 2007 COMARCH SA

Instytut Teleinformatyki

// LISTING #2 DRUGIE PODEJŚCIE

asix4 Podręcznik użytkownika Drajwer DDE Podręcznik użytkownika

Spis treści. Dzień 1. I Wprowadzenie (wersja 0906) II Dostęp do danych bieżących specyfikacja OPC Data Access (wersja 0906) Kurs OPC S7

Szablony. Szablony funkcji

1 Atrybuty i metody klasowe

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Instrukcja instalacji oraz obsługi czytników i kart procesorowych dla Klientów SBI Banku BPH S.A.

Język ludzki kod maszynowy

Wstęp do programowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Zarządzanie pamięcią

Programowanie w języku C++

Transkrypt:

Obiekty w plikach wykonywalnych, marshaling

Komponent w pliku exe Odczyt IClassFactory komponencie umieszczonym w pliku dll ładowanym w przestrzeń adresową klienta następuje poprzez wywołanie eksportowanej funkcji DllGetClassObject(). Podobnie rejestracja i wyrejestrowanie komponentu odbywa się przez eksportowane funkcje DllRegisterServer() i DllUnregisterServer(). Ze względu na fakt, że pliki uruchamialne nie eksportują funkcji i nie mogą być uruchomione w przestrzeni adresowej innej aplikacji, dostęp do obiektów odbywa się w inny sposób.

Komponent w pliku exe DllUnregisterServer). Komponent rejestrowany jako Komponent aktywowany jest w pliku wykonywalnym na żądanie przez system COM poprzez uruchomienie aplikacji komponentu z parametrem -Embedding. Możliwe są również parametry -RegServer i -UnregServer rejestrujący i odrejestrowywujący komponent (odpowiednik funkcji DllRegisterServer i aplikacja powinien zostać zdefiniowany w kluczu LocalServer32 (InprocServer32 dla serwerów w plikach dll) Aplikacja może również działać tradycyjnie, gdy nie podano żadnego parametru.

Komponent w pliku exe Ponieważ aplikacje nie mają możliwości bezpośredniego przekazania referencji do IClassFactory, proces ten odbywa się za pośrednictwem systemu COM. W trybie Embedding komponent powinien uruchomić system COM, utworzyć class factory i zarejestrować go za pomocą funkcji CoRegisterClassObject(). Jeśli aplikacja obsługuje wiele komponentów, rejestracja musi być przeprowadzona dla każdego z nich. CoInitializeEx(NULL,COINIT_MULTITHREADED); IClassFactory *pclassfactory = new CFactory(); DWORD dwregister; CoRegisterClassObject(CLSID_Stopwatch, pclassfactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwregister);

Komponent w pliku exe void CoRegisterClassObject( REFCLSID rclsid, //CLSID to be registered IUnknown * punk, //Pointer to the class object DWORD dwclscontext, //Context for running executable code DWORD flags, //How to connect to the class object LPDWORD lpdwregister //Pointer to the value returned ); CLSCTX_INPROC_SERVER - w przestrzeni adresowej dwclscontext definiuje zakres osiągalności obiektu: aplikacji komponentu CLSCTX_LOCAL_SERVER - w obrębie lokalnego komputera CLSCTX_REMOTE_SERVER -zdalnie

Komponent w pliku exe flags określa sposób połączenia do komponentu: REGCLS_SINGLEUSE - po połączeniu klienta z obiektem, zarejestrowany obiekt class factory przestaje być widoczny dla kolejnych klientów. Kolejna próba utworzenia obiektu powoduje uruchomienie osobnej aplikacji komponentu. REGCLS_MULTIPLEUSE - po połączeniu klienta z obiektem, zarejestrowany obiekt class factory wciąż jest widoczny dla kolejnych klientów. Ta sama aplikacja komponentu może więc obsługiwać wielu klientów.

Komponent w pliku exe Po rejestracji aplikacja powinna przejść w stan oczekiwania. Aplikacja powinna wyjść ze stanu oczekiwania gdy: nie istnieją już żadne instancje obiektów class factory ma licznik zablokowań równy zero aplikacja nie jest pod kontrolą użytkownika (dla aplikacji wizualnych) Przed zakończeniem działania dla każdego zarejestrowanego obiektu należy wywołać CoRevokeClassObject() i usunąć obiekt IClassFactory: CoRevokeClassObject(dwRegister); pclassfactory->release(); CoUninitialize();

Komponent w pliku exe HANDLE hevent; int main(int argc, char** argv) { if (argc >1) { char* sztoken = strtok(argv[1], "-/"; if (stricmp(sztoken, "Embedding") == 0) { CoInitializeEx(NULL,COINIT_MULTITHREADED); IClassFactory *pclassfactory = new CFactory(); DWORD dwregister; CoRegisterClassObject(CLSID_Stopwatch, pclassfactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwregister); } hevent = CreateEvent(NULL, FALSE, FALSE, NULL); WaitForSingleObject(hEvent, INFINITE); CoRevokeClassObject(dwRegister); pclassfactory->release(); CoUninitialize(); } } return 0;

Komponent w pliku exe unsigned long CStopwatch::Release() { if (InterlockedDecrement( &m_nreferencecount ) == 0) { delete this; if (InterlockedDecrement( &g_nserverlockcount ) == 1) SetEvent(hEvent); return 0; } return m_nreferencecount; }

Komponent jako serwis Komponent, który ma być uruchamiany jako serwis, rejestruje w systemie komponenty podobnie jak aplikacja. Powinna ona nastąpić gdy aplikacja uruchomiona jest bez parametrów. Dopuszczalne są parametry -RegServer i -UnregServer. Należy pamiętać, że serwis ma specyficzną procedurę uruchamiania. Powinien on rejestrować obiekty jako REGCLS_MULTIPLEUSE i nie powinien kończyć działania gdy wszystkie obiekty komponentów zostały zniszczone lecz na sygnał systemu zatrzymującego serwis.

Rejestracja komponentu dll, exe i serwisu Komponent w pliku wykonywalnym i jako serwis rejestrowany jest w: HKEY_CLASSES_ROOT\CLSID\{CLSID} {CLSID} jest identyfikatorem klasy. Klucz LocalServer32 wskazuje na lokalizację pliku wykonywalnego zawierającego komponent. Wartość typu string AppID nim zawarty wskazuje na identyfikator {AppID} umieszczony w: HKEY_CLASSES_ROOT\AppID\{AppID} Wartości zawarte w tym kluczu określają sposób uruchomienia i prawa dostępu.

Rejestracja komponentu dll, exe i serwisu Możliwe są następujące wartości: AccessPermission - zawiera prawa dostępu ActivateAtStorage - aktywuje komponent na serwerze, na którym znajduje się zapisany jego stan AuteticationLevel - ustala sposób autentyzacji LaunchPermisions - zawiera prawa uruchamiania LocalService - aktywacja komponentu następuje jako serwis Windows NT ServiceParameters - parametry przekazane serwisowi podczas uruchamiania RemoteServerName - określa nazwę komputera, na którym aktywowany będzie serwer RunAs -określa nazwę użytkownika użytego do aktywacji DllSurogate - określa aplikację użytą do załadowania komponentu w postaci dll (gdy pusty, użyty jest plik dllhost.exe). Komponent taki musi być zarejestrowany w HKEY_CLASSES_ROOT\CLSID\{CLSID}\LocalServer32

Marshaling Mashaling jest to sposób przekazywania wywołań metod wraz z parametrami pomiędzy klientem i serwerem COM. Każde wywołanie kodowane jest jako zestaw bajtów przesyłanych do serwera poprzez kanał transmisyjny. Odpowiedź serwera jest również kodowana i odsyłana do klienta. Proces kodowania i dekodowania odbywa się w module proxy i stub odpowiednio klienta i serwera. Zadaniem proxy jest emulacja wirtualnej tablicy funkcji interfejsu komponentu, przy czym funkcje, na które wskazują elementy vtable zajmują się kodowaniem funkcji i parametrów, wysyłaniem do kanału transmisyjnego, oczekiwaniem na odpowiedź, a gdy taka nadejdzie dekodują ją i zwracają rezultat procesowi wywołującemu. Kod stub nasłuchuje na kanale transmisyjnym, odbiera nadchodzące dane, identyfikuje funkcję i parametry, wywołuje metodę komponentu, koduje odpowiedź i odsyła ją kanałem do stub.

Marshaling Wyróżnia się trzy typy mashalingu: standardowy poprzez informację w Type Library niestandardowy Standardowy marshaling jest to sposób transmisji danych domyślnie generowany przez kompilator MIDL. Obejmuje on wszystkie podstawowe typy danych i samodefiniujące się struktury danych. Kompilator MIDL generuje dla pliku Test.idl pliki: Test.h z deklaracją klas abstrakcyjnych interfejsów Test_i.c zawierający definicje stałych CLSID Test_p.c zawierający kod proxy/stub dlldata.c z kodem dla pliku dll zawierającego proxy/stub Testps.def z definicją eksportowanych funkcji

Marshaling Kompilacja tych plików do pliku dll (preprocesor musi mieć zdefiniowane REGISTER_PROXY_DLL i _WIN32_DCOM) powoduje wygenerowanie biblioteki-komponentu proxy/stub dla zdefiniowanych interfejsów. Eksportowane funkcje biblioteki proxy/stub DllRegisterServer i DllUnregisterServer rejestrują komponent proxy/stub i interfejsy obsługiwane przez tą bibliotekę (HKEY_CLASES_ROOT\Interface\{IID}, gdzie {IID} identyfikuje interfejs, a wartość klucza ProxyStubClsid32 wskazuje na zarejestrowany komponent proxy/stub). W przypadku gdy komponent znajduje się w pliku dll możliwe jest zawarcie w nim również komponentu proxy/stub. Dla standardowego marshalingu, aby komponent mógł uruchamiany na zdalnej maszynie, komponent proxy/stub musi być tam również zarejestrowany.

Marshaling Dla określonej, dość ograniczonej grupy typów danych opracowano tzw. type library marshaler: unsigned char BYTE short enum type VARIANT_BOOL CY VARIANT double CURRENCY IDispatch* float BSTR IUnknown* int DATE SAFEARRAY(type) long SCODE type* Jest on oparty na typach ograniczonych przez atrybut oleautomation interfejsu. Ogranicza to znacznie zbiór dostępnych typów, jednak wraz z interfejsem IDispatch gwarantuje to kompatybilność komponentu z językami skryptowymi (VBScript, JScript).

Marshaling Niestandardowy marshaler służy do przesyłania danych o nietypowej strukturze, najczęściej definiowanej poza plikiem IDL. Wymaga to realizacji interfejsu IMarshal wraz z interfejsem komponentu i zrealizowanie operacji na poziomie kanału RPC.