Com / DCom 1 Concept et historique 2 L’interface IUnknown 3 L’interface IClassfactory 4 L’interface IDispatch 5 Un petit composant COM 6 Conclusion 7 Bibliographie
l’informatique répartie 1 Concept et Historique 1.1 Historique 1985 Presse Papier DDE 80’s début de l’informatique répartie 1992 OLE 1 1992 OSF RPC DCE 1995 COM 1996 DCOM
1.2 Concept Chaque composant COM/DCOM est représenté par un identifiant unique codé sur 128 bits. COM/DCOM, est un envirronement de programmation répartie. Un objet COM/DCOM est représenté par son interface aux yeux de “l’utilisateur”. Un Objet COM/DCOM, peut être instancié de trois façons différentes - Intra processus - local - distant L’utilisateur peut préciser quelle type d’intance il souhaite. S’il ne le fait pas, c’est l’instance par defaut qui est prise en compte (celle ci est définie par les enrgistrements dans la base de registre).
2 IUnknown IUnknown est l’interface de base que doit implementer tout composant COM / DCOM Elle possède trois interfaces : - QueryInterface - AddRef - Release C’est par cette interface que l’on peut instancier un composant COM/DCOM. Voici la definition en IDL de Iunknown [local, object, uuid(00000000-0000-0000-c000-000000000046), pointer_ default(unique)] interface IUnknown { typedef [unique] IUnknown * LPUNKNOWN; HRESULT QueryInterface ( [in] REFIID riid, [out, iid_is(riid)] void ** ppvObject ); ULONG AddRef (); ULONG Release (); }
2.1 QueryInterface Cette méthode est celle qui nous permet d’obtenir un pointeur d’interface vers l’objet COM/DCOM dont nous possédons l’ID. Le pointeur d’interface est retourné en second paramêtre. 2.2 AddRef Cette méthode permet d’indiquer au système quand l’utilisateur ajoute un pointeur sur l’interface utilisée. 2.3 Release Cette méthode permet d’indiquer au système quand l’utilisateur enleve un pointeur sur l’interface utilisée. Si le pointeur suprimé est le dernier, alors Release detruit l’intance de l’bojet instancié.
3 IClassFactory Cette interface contient deux méthodes destiné à traité avec des d’objets COM (leurs instances). Cette interface contient deux méthodes : - CreateInstance - LockServer CreateInstance a pour but d’instancier des Objets qu’ils soient distants ou locaux. La fonction LockServer permet de mettre l’Objet en mémoire afin de l’instancier au plus vite.
4 IDispatch L’interface IDispatch est interessante car elle permet d’utiliser un objet COM/DCOM dans des langages comme VB, ASP, JScript qui ne permettente pas de manipuler les pointeurs d’interface. Elle permet entre autre de d’obtenir la position de la méthode dans la v-table. Pour ce faire, il faut utiliser deux méthodes définient par cette interface. - GetIDsOfNames, qui retourne le numéro correspondant à la fonction définie par la chaine de caractère passée en parmètre - Invoke qui permet de passer à la fonction dont on a obtenu le numéro
5 Un petit composant COM Après ces explications, nous allons créer notre composant COM. Celui ci nous permettra de réaliser la somme de deux entier x et y. Nous créons ce composant à l’aide de Visual C++ 6.0 Voici l’interface idl de notre composant : import “unknwn.idl”; [ object, uuid(10000001-0000-0000-0000-000000000001) ] interface Isum : IUnknown { HRESULT Sum([in] int x, [in] int y, [out, retval] int* retval); }; Pour le compiler, on clique droit sur le fichier puis sur compile Isum.idl le compilateur MIDL génère les fichier ISum.h, ISum_i.c et ISum_d.c
qui implémente cette interface. Nous appelons cet class CInsideDCom Une fois l’interface COM/DCOM obtenue, il nous reste à implémenter un objet qui implémente cette interface. Nous appelons cet class CInsideDCom class CInsideDCom : public ISum { public: // IUnknown ULONG __stdcall AddRef ();//incrémente m_cRef ULONG __stdcall Release ();//decremente m_cRef s’il est à 0 detruit l’objet HRESULT __stdcall QueryInterface ( REFIID riid, void** ppv ); // ISum HRESULT __stdcall Sum ( int x, int y, int* retval ); CInsideDCom(); virtual ~CInsideDCom(); private: ULONG m_cRef;//compte le nombre d’intances };
6 Conclusion Les avantages de Com/Dcom - environnement abouti - permet un liaison avec de nombreux langages (C++, Java, Vb, VBScript, Jscript, ...) - sécurité implémenté - Basé sur DCE Inconvénients - Propriétaire MicroSoft - ne troune que sur plateforme Win32 - Pas de soutien externe à MicroSoft - La seule tentative de portage (Solaris) fut un échec Comment se place Com/Dcom par rapport à Corba
7 Bibliographie Pour réaliser cette présentation, je me suis appuyé sur les ouvrages suivants : - Au coeur de DCOM de Guy et Henry Eddon aux editions Microsoft Press - Inside OLE de Kraig Brockschmidt Je me suis également appuyée sur la documentation électronique fournie par microsoft : MSDN