Microsoft Interface Definition Language

Podobne dokumenty
Zdarzenia (events, connection points)

Technologie COM i ActiveX COM - Component Object Model

Obiekty w plikach wykonywalnych, marshaling

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

Komunikacja i wymiana danych

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

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

Programowanie współbieżne i rozproszone

76.Struktura oprogramowania rozproszonego.

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

Zarządzanie pamięcią

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

Szablony klas, zastosowanie szablonów w programach

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

Wykład 4: Klasy i Metody

Programowanie niskopoziomowe

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

Lab 9 Podstawy Programowania

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

1. Wybierz File New Application. Pojawi się nowa aplikacja w Delphi.

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.

Architektura składnikowa a architektura klient serwer. Programowanie składnikowe. Programowanie składnikowe w modelu COM

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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

Serwery Statefull i Stateless

Aplikacje internetowe i rozproszone - laboratorium

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Wykład 3 Składnia języka C# (cz. 2)

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

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

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

PHP 5 język obiektowy

Pakiety i interfejsy. Tomasz Borzyszkowski

Instrukcja laboratoryjna cz.3

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Delphi podstawy programowania. Środowisko Delphi

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Tworzenie aplikacji rozproszonej w Sun RPC

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Zaawansowane aplikacje internetowe - laboratorium

Podstawy programowania. Wprowadzenie

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

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

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Dziedziczenie. Tomasz Borzyszkowski

Konfiguracja serwera DNS w systemie Windows Server 2008 /2008 R2

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

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

RPC Remote Procedural Call. Materiały do prezentacji można znaleźć na stronie:

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Rozdział 4 KLASY, OBIEKTY, METODY

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Aplikacje RMI Lab4

Instrukcja do programu DoUPS 1.0

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

Tworzenie własnych komponentów

Programowanie obiektowe

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

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Programowanie obiektowe

Instrukcja pobrania i instalacji. certyfikatu Microsoft Code Signing. wersja 1.4

onfiguracja serwera DNS w systemie Windows Server 2008 /2008 R2

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

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Ada-95. Dariusz Wawrzyniak

Wykład 5 Okna MDI i SDI, dziedziczenie

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Lista wprowadzonych zmian w systemie Vario v. 3.3 od wydania do wydania

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Tworzenie dokumentacji

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

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

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Wykład 8: klasy cz. 4

1 Wprowadzenie do J2EE

Baza danych sql. 1. Wprowadzenie

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Aplikacje RMI

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

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

Wstęp. do języka C na procesor (kompilator RC51)

Wykład 9: Polimorfizm i klasy wirtualne

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Paweł Kurzawa, Delfina Kongo

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

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wykład 5: Klasy cz. 3

Podstawy Rejestru systemu. Poddrzewa

Transkrypt:

Microsoft Interface Definition Language

IDL IDL (Interface Definition Language) kompilowany jest przez MIDL.exe: Tworzy pliki nagłówkowe klas abstrakcyjnych dla zdefiniowanych w pliku *.idl interfejsów Tworzy kod proxy i stub dla serwera i klienta Tworzy pliki definicji UUID (universally unique identifier) unikalnych identyfikatorów dla interfejsów, komponentów i type library Tworzy pliki ułatwiające rejestrację komponentu Tworzy skompilowaną wersję IDL type library

Type Library (TLB) Type library zawiera wszystkie informacje potrzebne do ekstrakcji struktury interfejsu. Biblioteka ta może stanowić osobny plik *.tlb, najczęściej jednak jest on przechowywany w zasobach pliku *.dll lub *.exe, w którym znajduje się odpowiadający mu komponent.

UUID System Windows do identyfikacji komponentów stosuje UUID 128 bitowy klucz. Liczba unikalnych wartości takiego klucza i sposób jego generacji powoduje, że wygenerowany losowo klucz jest z ogromnym prawdopodobieństwem unikalny. 2 128 umożliwia utworzenie 2 396 199 449 901 404 018 kombinacji na sekundę przez najbliższe 4.5 miliarda lat Generacja UUID oparta jest na: 48 bitowym numerze karty sieciowej Aktualnym czasie systemowym wyrażonym w 100ns odstępach od 15 października 1582

Przykładowy plik IDL // Timers.idl : IDL source for Timers.dll // // This file will be processed by the MIDL tool to // produce the type library (Timers.tlb) and marshalling code. import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(eebf6d1e-8ef1-4acf-9e5f-4d95e01d698a), helpstring("istopwatch Interface"), pointer_default(unique) ] interface IStopwatch : IUnknown { [helpstring("starts the timer")] HRESULT Start(); [helpstring("returns the number of seconds that have \ passed since Start was called")] HRESULT ElapsedTime([out, retval] float* Time); };

Przykładowy plik IDL [ uuid(d7eba784-2bf1-11d3-a48b-0000861c844e), version(1.0), helpstring("timers 1.0 Type Library") ] library TIMERSLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(83dc3c46-1259-4f95-a2d1-cd11a8819e2e), helpstring("stopwatch Class") ] coclass Stopwatch { [default] interface IStopwatch; }; };

import, #include import "filename"; #include "filename" Dyrektywa import i #include włącza do pliku IDL zawartość innego pliku. Jej działanie jest analogiczne do dyrektywy #include "filename" języka C++.

interface Interfejs definiowany jest poprzez słowo kluczowe interface. Ogólna forma definicji ma następującą postać: [ header ] interface name : inherited_interface { interface definition };

interface: header W części header definiowane są atrybuty interfejsu. Dla interfejsu COM zdefiniowane są m.in. następujące atrybuty: object local uuid() hidden helpstring() pointer_default() version [ object, uuid(eebf6d1e-8ef1-4acf-9e5f-4d95e01d698a), helpstring("istopwatch Interface"), pointer_default(unique), ]

interface: header: object, local Atrybut object oznacza, że definiowany będzie interfejs COM. Dla tego typu interfejsu: komponent będzie mógł być wywoływany zdalnie * każda metoda musi zwracać HRESULT * o ile nie zdefiniowano atrybutu local, przy którym kompilator MIDL nie generuje kodu proxy i stub. Gdy nie został zdefiniowany atrybut object przyjmowany jest interfejs typu DCE RPC.

interface: header: uuid Atrybut uuid() przypisuje definiowanemu interfejsowi określony numer GUID. Ten numer jest unikalnym numerem identyfikującym interfejs. Atrybut ten jest wymagany dla interfejsu COM.

interface: header: helpstring, hidden Atrybut hidden powoduje, że dany interfejs nie będzie eksponowany przez narzędzia programistyczne. Będzie on natomiast poprawnie implementowany i kompilowany. Zdefiniowany opis w atrybucie helpstring() używany jest przez narzędzia programistyczne do podania bardziej szczegółowych informacji o interfejsie niż sama jego nazwa. Maksymalna długość opisu wynosi 255 znaków.

interface: header: pointer_default Atrybut pointer_default() definiuje domyślny sposób translacji wskaźników dla argumentów metod. Sposób ten może być też indywidualnie definiowany dla każdego parametru. ref: Wskaźniki muszą zawsze wskazywać na prawidłowo zaalokowany obszar pamięci (nie dopuszcza się wskaźnika NULL) Wskaźnik nie zmienia się w trakcie wywołania (przed i po wskazuje na ten sam obszar pamięci) Serwer nie alokuje nowej pamięci. Zwracane wartości zostają zapisane w obszarze zaalokowanym przed wywołaniem Nie dopuszcza się aby różne zmienne wskaźnikowe wskazywały na ten sam obszar pamięci Zmienna z tym atrybutem nie może być używana do parametrów typu out

interface: header: pointer_default ptr: Dopuszczalne są wskaźniki NULL. Wskaźnik może ulec zmianie w trakcie wywołania z NULL na non-null (może zostać zaalokowany obszar pamięci) Dopuszcza się aby różne zmienne wskaźnikowe wskazywały na ten sam obszar pamięci Używanie tego typu wskaźników wiąże się z większym nakładem czasowym podczas wywołań, aby zidentyfikować dane wskazywane przez wskaźnik, czy nie jest on NULL i czy inna zmienna nie wskazuje na ten sam obszar.

interface: header: pointer_default unique: Dopuszczalne są wskaźniki NULL Wskaźnik może ulec zmianie w trakcie wywołania (pamięć może zostać zaalokowana lub zwolniona) Gdy wskaźnik zmienia się z non-null na NULL pamięć nie jest zwalniana automatycznie (adres pamięci musi być zapamiętany przed wywołaniem funkcji) Nie dopuszcza się aby różne zmienne wskaźnikowe wskazywały na ten sam obszar pamięci Zmienna z tym atrybutem nie może być stosowana do określania rozmiarów struktur, np. tablic.

interface: methods [ attributes ] HRESULT name( param-list ); interface IStopwatch : IUnknown { [helpstring("starts the timer")] HRESULT Start(); [helpstring("returns the number of seconds that have \ passed since Start was called")] HRESULT ElapsedTime([out, retval] float* Time); };

interface: methods: attributes Pole atrybutów definiuje cechy specyficzne dla danej metody. Najczęściej używanymi atrybutami dla interfejsów COM są: hidden local, call_as() helpstring() propget propput propputref id()

methods: attributes: hidden, helpstring, local, call_as() Atrybuty hidden i helpstring mają analogiczne znaczenie jak dla interfejsu. Atrybuty local i call_as() pozwalają na ograniczenia dostępności określonej metody tylko gdy komponent pracuje w przestrzeni adresowej klienta (local) oraz pozwalają na wskazanie, że inna metoda ma być używana w przypadku wywołań zdalnych (call_as()).

methods: attributes: propget, propput, propputref Atrybuty propget, propput i propputref wskazują, że metoda służy do dostępu do właściwości. W takim przypadku nazwa metody określa nazwę właściwości. Dwie oddzielne metody o tej samej nazwie muszą zostać zdefiniowane jeżeli właściwość jest zarówno do odczytu (propget) jak i do zapisu (propput, propputref). Atrybut propputref używany jest w przypadku, gdy argument przekazywany jest przez referencję a nie przez wartość (np. referencja do obiektu).

methods: attributes: id Atrybut id() definiuje identyfikator dla funkcji dla interfejsu dualnego (IDispatch). Argumentem atrybutu jest 32-bitowa wartość bez znaku.

methods: parameters Każdy parametr ma oprócz typu danej i nazwy zdefiniowane atrybuty. Mają one wyższy priorytet od atrybutów definiowanych dla metody. Definiują one sposób przekazywania danych do i z serwera. Podstawowymi atrybutami są: ref ptr unique in out retval iid_is()

parameters: attributes: ref, ptr, unique Atrybuty ref, ptr, unique mają identyczne znaczenie jak dla atrybutu pointer_default interfejsu. Zmieniają one domyślne ustawienie indywidualnie dla określonego parametru.

parameters: attributes: in, out Atrybuty in, out określają kierunek przepływu danych dla argumentu (do, z serwera lub w obie strony). Jeżeli atrybut jest typu out lub in, out to argument musi być przekazywany przez referencję. Przekazywanie argumentów prostych z atrybutem in może odbywać się poprzez wartość.

parameters: attributes: retval Jeden z parametrów typu out może posiadać dodatkowy atrybut typu retval. W języku C++ w przypadku użycia tzw. smart pointers dla interfejsu atrybut ten powoduje, że wskazany argument będzie użyty jako wartość zwracana przez funkcję. Gdy używany jest tzw. raw interface, parametr ten nie ma wpływu na postać funkcji w C++.

parameters: attributes: iid_is Atrybut iid_is używany jest dla argumentów przekazujących wskaźnik do różnych interfejsów za pomocą wspólnego bazowego interfejsu. Atrybut ten wskazuje na argument, który określa GUID aktualnie żądanego interfejsu aby właściwie przeprowadzić jego marshalling.

library Biblioteka typów (Type Library) definiowana jest poprzez słowo kluczowe library. Ogólna forma definicji ma następującą postać: [ header ] library name { library definition };

library: header W części header definiowane są atrybuty biblioteki. Zdefiniowane są następujące atrybuty: control uuid() hidden helpstring() version [ ] uuid(d7eba784-2bf1-11d3-a48b-0000861c844e), version(1.0), helpstring("timers 1.0 Type Library")

library: header: uuid, hidden, helpstring, version, control Atrybuty uuid, hidden, helpstring, version mają analogiczne znaczenie jak dla atrybutów interfejsu. Atrybut control wskazuje, że biblioteka dotyczy obiektów takich jak ActiveX COM (controls). Jej zawartość będzie prezentowana jedynie podczas przeglądania komponentów dla projektów GUI.

library: library definition W bloku definicji biblioteki typów znajduje się lista interfejsów i CoClass, które zostaną w niej zawarte (nazwy interfejsów pojawiających się wewnątrz bloku coclass nie muszą być specyfikowane ponownie w bloku library). Możliwe jest włączenie innej biblioteki poprzez polecenie importlib. library TIMERSLib { importlib("stdole32.tlb");... interface IStopwatch;... [ header ] coclass name { coclass definition } };

coclass CoClass (Component Class) definiuje grupę interfejsów związanych z określonym komponentem. library TIMERSLib { importlib("stdole32.tlb");... interface IStopwatch;... [ header ] coclass name { coclass definition } };

coclass: header Blok header może zawierać następujące atrybuty: licensed control uuid() hidden helpstring() version CoClass z atrybutem licensed może być jedynie używana przez klientów posiadających odpowiedni klucz (licencję). Serwer musi posiadać interfejs IClassFactory2. Znaczenie pozostałych atrybutów jest analogiczne jak dla nagłówka biblioteki typów.

coclass: coclass definition Blok definicji coclass zawiera listę interfejsów wraz z atrybutami: [ attributes ] dispinterface name; [ attributes ] interface name; Zdefiniowane są następujące atrybuty: source default restricted Interfejs określony słowem dispinterface musi posiadać zdefiniowany tzw. dualny interfejs (posiadać zaimplementowany interfejs IDispatch).

coclass: definition: source, default, restricted Atrybut source definiuje interfejs, który musi zostać zaimplementowany po stronie klienta dla wywołań zwrotnych (call-back). Serwer powinien jednocześnie zawierać interfejs IConnectionPointContainer. Atrybut default określa domyślny interfejs dla makrojęzyków (np. Visual Basic). Atrybut ten może występować wyłącznie raz dla interfejsów bez atrybutu source i raz dla interfejsów typu source. Atrybut restricted wyklucza interfejs z zestawu dostępnych dla makrojęzyków. Nie może on jednocześnie występować z atrybutem source.