A telecharger
Transcription
A telecharger
IHM DLL, COM et DirectX Windows : les DLL ! Les bibliothèques de liens dynamiques (ou DLL : dynamic link library), comme winmm.dll, sont des fichiers séparés des programmes ! Ces fichiers contiennent du code binaire correspondant à des fonctions qui peuvent être appelées par des programmes ou par d'autres DLL ! Une bibliothèque ne devient active que lorsqu'elle est appelée ! Windows lui-même fonctionne avec trois bibliothèques de liens dynamiques qui correspondent à trois parties de Windows : Kernel, User et GDI. 1 Windows : utilité des DLL ! Plusieurs programmes peuvent se partager le code binaire d’une fonction si celle-ci est dans une DLL (plutôt que de répéter dans chaque programme la même portion de code source) ! Les programmes se branchent à l'exécution sur les DLL correspondantes (d'ou le nom de lien dynamique). ! Lors de l ’édition de liens, il faut lier le programme avec une bibliothèque d'importation ou 'bibliothèque de référencement' (Elle possède elle aussi l'extension '.lib ’) " Celle-ci ne contient pas de code mais des informations pour les liens dynamiques afin d'indiquer dans quelles DLL se trouvent le code binaire des fonctions utilisées Edition de liens avec une bibliothèque statique 2 Edition de liens avec une bibliothèque dynamique Réutilisation du code... ! Lorsque l'on écrit une DLL en C++, par exemple, l'algorithme propriétaire de C++, qui dénature les noms, rend impossible l'utilisation de la DLL par autre chose qu'un client composé avec le même compilateur. ! Cet objet n'est utilisable ni avec Visual Basic ni par des clients Java. ! Si un développeur modifie et redéploie une DLL, il doit s'assurer qu'aucun numéro de la DLL n'a changé, auquel cas les liaisons statiques à cette DLL provoqueraient une incompatibilité avec le client. 3 Réutilisation du binaire ! Aller plus loin et permettre la réutilisation du binaire… ! Créer des composants logiciels pouvant être appelés et exécutés dans les OS adaptés. " Intégration forte au niveau de l'OS : notion de middleware " Nécessité de pouvoir lancer l'exécution des objets à distance. (version objet des RPC) # raison du développement de CORBA Rappel : ce sont ces middleware qui supporte les Desktop Environment de linux : CORBA pour Gnome, ORB pour KDE ! Du coté de Microsoft : Component Object Model (modèle d'objets composants) ! COM est une spécification très largement respectée, destinée à offrir des interfaces de programmation réutilisables et indépendantes du langage. ! Trois motivations à la base de l'effort COM/OLE : " il faut pouvoir distribuer des binaires " on doit pouvoir accéder aux composants par-dessus la barrière du langage de programmation " il doit être possible d'ajouter des composants au système, et que les anciens composants puissent les utiliser sans recompilation ! COM permet ces trois points, et il crée donc ce nouveau type de software qu'est le "Component Software" (VBX pour Visual Basic). ! Alternative (compétition ?) : " CORBA, beaucoup de similitudes avec COM " OPENDOC, créé par CIL (Component Integration Labs), qui repose sur l'implémentation d'IBM de CORBA : SOM ! quelques efforts pour porter COM/DCOM sur d’autres plates-formes: " Implémentation de DCOM sous Linux : EntireX (Software AG http://www.softwareag.com/entirex/) " Ponts COM et .NET vers Java : Jintegra et Ja.Net (Intrasyc http://www.intrinsyc.com/) 4 ! COM+ est le résultat d'une lente évolution qui débuta en 1990 " 1990 : OLE/OLE 2 (Object Linking & Embedding): Architecture de base de Windows. Permet la coopération Multi-Applications (documents composites) " 1992 : COM (Component Object Model) est livré avec Windows98 et Windows NT 4.0. Coeur de OLE2. " 1996 : DCOM est la version pour les objets Distribués. Il permet à un composant de se "déplacer" et de s'exécuter sur une autre machine. " 1996 : ActiveX version Internet d'accès aux objets COM/DCOM. Les contrôles ActiveX permettent de faciliter la distribution des composants à travers l'Internet, et d'intégrer DCOM sur le navigateur Web. ! Un objet COM dispose d’interfaces ! COM permet l’interoperabilité en fournissant une matrice de pointeurs vers les méthodes exportées par l'interface 5 Classe de base IUnknow ! Toutes le interfaces COM reposent sur l'interface IUnknow qui joue le rôle d'une classe de base abstraite en C++ pour fournir un jeu de fonctions à implémenter et pour permettre l'ajout de fonctions complémentaires par chaque interface. La définition de IUnknow inclut trois fonctions : " QueryInterface() • Sert à atteindre les pointeurs dirigeant vers les interface dérivées de l'interface en cours. " AddRef • Incrémente le compteur de références de l'interface en cours. " Release • Sert à libérer une interface qui n'est plus utilisée. Décrémente le compteur de références et détruit l'objet lorsque le compte atteint zéro. Les objets COM ! L'interface de base, qu'il est obligatoire d'implémenter pour un objet, est l'interface IUnknown. Cette interface est disponible pour tous les objets OLE/COM. ! L'interface IUnknown possède, entre autres, une méthode appelée QueryInterface() qui permet à un programme utilisant l'objet considéré de prendre connaissance de l'existence d'une interface implémentée dans l'objet. Si l'interface demandée existe, la méthode QueryInterface() renvoie un pointeur sur celle-ci afin que l'objet demandeur puisse l'utiliser. ! Chaque interface d'un objet est identifiée de façon unique par un GUID (Globally Unique IDentifier) attribué par Microsoft pour éviter tout conflit d'identifiant. Ce dernier, codé sur 128 bits, est stocké dans la base des registres de Windows. Dans cette base, pour chaque GUID, on trouve le nom et la localisation du serveur (DLL par exemple) fournissant l'objet dont on veut accéder à l'une de ses interfaces. On trouve également pour chaque interface un certain nombre d'informations telles que sa version, les types de données reconnus, etc. 6 interface IUnknown { virtual HRESULT QueryInterface(IID& iid, void** ppvObj) = 0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; } Demande d'interface 7 Quel est le lien entre COM et les IHM ! ! Avec Windows 95, Microsoft a voulu créer une meilleure plateforme pour les jeux. Cela a pris la forme de pilotes qui permettent un accès direct aux fonctionnalités matérielles des unités graphiques, audio et vidéo; les développeurs n'ont plus besoin d'écrire leurs propres pilotes. " Souvent, un pilote par type de carte graphique / carte son ! La SDK directX est entièrement basée sur des objets COM ! C'est pourquoi, à chaque fois que vous installez une nouvelle version de DirectX sur votre PC, les programmes qui utilisait les anciennes versions de la DirectX fonctionnent toujours. Vous pouvez aussi programmer de nouvelles applications en utilisant les anciennes fonctions de DirectX 1,2,3,4… ! Tous les objets COM ont une interface commune Iunknown qui elle peut être modifiée et qui permet d'accéder aux différentes interfaces et leurs méthodes. 8 DirectX : Les éléments ! DirectDraw DirectDraw permet d'exploiter les capacités 2D d'une carte graphique tout en autorisant l'utilisant des services du GDI (Graphic Device Interface), l'API graphique de Windows. ! Direct3D Direct3D permet de créer des scènes de 3D, d'en manipuler les objets avec une palette de services et de les afficher en utilisant les capacités 3D d'une carte graphique quand elle en dispose. Direct3D dispose de deux modes de d'utilisation: " Le mode immédiat permet de gérer la transformation, l'illumination et le rendu de simples primitives (triangles, points, droites). " Le mode retenu met à la disposition du développeur un moteur 3D complet capable de gérer des objets. DirectX : Les éléments ! DirectSound DirectSound permet d'exploiter les capacités d'entrée-sortie d'une carte son pour numériser, mixer des échantillons sonores et en restituer le résultat, éventuellement agrémenté d'effets 3D perfectionnés. ! DirectInput DirectInput permet de récupérer les informations transmises par l'utilisateur, que ce soit par l'intermédiaire de la souris, du clavier ou du joystick. Elle permet aussi de renvoyer des données vers des périphériques à retour de force. ! DirectPlay DirectPlay permet de mettre en place et d'administrer un dialogue point à point ou client-serveur entre plusieurs utilisateurs désirant évoluer simultanément dans un même contexte ; par exemple pour une interactivité entre joueurs connectés par Internet, par un réseau local ou par une connexion directe (modem ou câble série). 9 Éléments DirectMedia ! DirectX Transform DirectX Transform pour la création d'effets graphiques dynamiques en 2D et en 3D, notamment pour la fusion des couches alpha et les distorsions de surface. ! DirectAnimation DirectAnimation est un ensemble de contrôles (chemins de déplacement, sprites, éléments de 3D, séquenceurs) qu'il est possible de référencer depuis une page Web. Ces contrôles disposent d'API qui permettent de les manipuler via un script JScript ou VBscript ou encore une applet Java. Il est possible d'intégrer ces contrôles dans une application développée en Java, en Visual Basic ou en C++. ! DirectShow DirectShow permet de jouer des séquences vidéo et audio (accédés en local ou à distance) et d'en capturer via des périphériques spécialistes. DirectShow supporte de nombreux formats : MPEG-1, WAV, MIDI, MPEG-2, PCM, DSS, AVI, … DirectX ! L'avantage des fonctions de DirectX pour les programmeurs est que celles-ci utilisent (si possible) un algorithme alternatif (confié au processeur) quand le matériel installé ne gère pas ce type de traitement. Il fonctionne comme une surcouche de Windows, évitant théoriquement aux programmeurs de devoir s'occuper des différences matérielles qui existent entre les différents PCs. Par exemple, si une carte vidéo n'a pas de fonctions dédiées à la 3D, DirectX demandera au processeur de s'occuper du rendu d'une image de synthèse ou le rendu 3D en temps réel. 10 DirectShow et MCI ! Les premières versions de DirectX n'eurent pas d'effet sur les applications multimédia; DirectSound, la partie de DirectX chargée de jouer le son, n'était pas prévu pour de telles applications et ne pouvait pas enregistrer le son. ! Depuis, Microsoft a ajouté DirectShow qui rend plus facile la programmation des applications multimédia. ! DirectShow encapsule l'interface MCI Programmer en DirectX ! Ne pas avoir peur de COM… ! Suffisamment de documentation et d’exemples (DirectX SDK, internet) ! L'accès bas niveau aux objets est souvent masqué par des fonctions de + haut niveau. ! Permet l’utilisation de tous les composants de windows (drivers WDM, filtres direct show, ect…) " Utilisation de GraphEdit 11 ! Comme dans toute conception objet, un objet COM doit être instancié avant de pouvoir être utilisé. Voici à quoi ressemble l'instanciation d'un objet COM en langage C sous Windows: // Création d'une instance COM de DirectDraw7 LPDIRECTDRAW7 lpDD7 = NULL; GUID *lpDevice = NULL; CoInitialize(NULL); if (FAILED(CoCreateInstance(CLSID_DirectDraw7, NULL, CLSCTX_ALL, IID_IDirectDraw7, (LPVOID *)&lpDD7))) { CoUninitialize(); return(FALSE); } if (FAILED(lpDD7->Initialize(lpDevice))) { CoUninitialize(); return(FALSE); } ! CoInitialize() permet d'initialiser la librairie COM. Son appel est obligatoire avant tout usage de COM. CoUninitialize() pour la fermeture de la librairie COM ! CoCreateInstance() permet de créer une instance de l'objet COM dont l'interface est indiquée (IID_IDirectDraw7). Dans ce cas, nous créons une instance de DirectDraw version 7. Reportez-vous à la documentation et aux fichiers d'entête de DirectX pour savoir quelles sont les différentes interfaces disponibles pour les différents composants de DirectX. 12 ! Les énumérations deviennent très courantes… via des fonctions réflexes. ! Exemple : lorsque avec DirectX vous souhaitez connaître la liste des périphériques d'entrée disponibles sur l'ordinateur, vous devez utiliser une fonction callback ! La méthode importante ici est EnumDevices qui passe en paramètre le nom de la fonction callback // Enumère les périphériques d'entrée pour charger la listbox // Appelé directement ou indirectement depuis le WinMain LPDIRECTINPUT8 lpDi8 = NULL; if (FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID *)&lpDi8, NULL))) return(FALSE); if (FAILED(lpDi8->EnumDevices(DI8DEVCLASS_ALL, EnumDirectInputDevicesCallback, hListBox, DIEDFL_ATTACHEDONLY))) return(FALSE); ! Voici le code de la fonction callback : // --------------------------------------------------------// Fonction callback d'énumération des périphériques // d'entrée et de chargement de la listbox // ---------------------------------------------------------BOOL CALLBACK EnumDirectInputDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) { HWND hListBox = (HWND)pvRef; SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)lpddi->tszProductName); return(DIENUM_CONTINUE); } 13 ! Puis beaucoup de copier-coller ! Et des appels de fonctions de haut niveau… g_pDisplay = new CDisplay(); g_pDisplay->CreateFullScreenDisplay( hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP ); // Create a surface, and draw a bitmap resource on it. hr = g_pDisplay->CreateSurfaceFromBitmap( &g_pAnimationSurface, MAKEINTRESOURCE(IDB_ANIMATE_SHEET ), SPRITE_DIAMETER * 5, SPRITE_DIAMETER * 6 ); if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) return E_FAIL; . . . D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); DirectX ! Attention : DirectX n'inclut pas les objets / méthodes pour la réalisation / gestion des IHM (pas de contrôles prédéfinis). 14 Perspectives IHM ! Les applications interactives sont de plus en plus souvent implémentées au-dessus de librairies graphiques évoluées telles qu'OpenGL ou DirectX. ! Toutefois, jusque très récemment, la plupart des systèmes de fenêtrage étaient toujours basés sur des modèles graphiques vieux de plus de 15 ans, tels que GDI, QuickDraw ou la Xlib. Aqua, l'interface utilisateur de MacOS X donne pourtant une petite idée de ce que pourrait être un système de fenêtrage reposant sur un modèle graphique évolué incluant la transparence, le placage de textures, des transformations 3D ou l'éclairage. Interface Aqua 15 AVALON ! Les prochaines versions de Windows sont annoncées avec une fusion du GDI et de DirectX : Nom de code AVALON ! L'interface reposera sur les WGF (Windows Graphic Foundation). ! Fera partie du successeur de XP (Nom de code longhorn, puis VISTA) prévu pour 2006 AVALON 16 17 18