2.11.1 Présentation de l’automation
L’automation permet à une application d’utiliser des fonctionnalités d’une autre application, ceci même si elle est pilotée par un utilisateur [MAR 98]. A titre d‟exemple l‟automation permet à une application qui a besoin de créer des graphiques d’utiliser les fonctionnalités d’Excel à cette fin. Les fonctionnalités d’Excel peuvent être employées sans que cette application ne soit activée à l’écran.
Figure 2.6 Exemple d’automation
Le fait qu’une application puisse exposer ses interfaces est l’objectif premier de COM, alors qu‟apporte l’automation dans tout ceci ?
Des applications clientes généralistes comme Visual Basic doivent prendre en compte une foule de composants avec des interfaces personnalisées dont Visual Basic ignore tout. L’automation standardise l’exposition des interfaces via une interface dédiée, IDispatch [MAR 98]. Cette fonctionnalité vient en concurrence avec la bibliothèque de types pour les applications qui ne peuvent pas les gérer, particulièrement avec les langages de script interprétés, tels que VBScript, JScript, Internet Information Serveur,…etc.
2.11.2 L’interface IDispatch
C‟est une Interface standard supplémentaire dérivant de l‟interface IUnknown. Elle est utilisée pour permettre l‟appel des méthodes d‟un objet COM à travers un langage simple (comme VB Script) qui ne supporte pas l‟utilisation des pointeurs (comme C++/Java). Cette interface doit permettre d’exposer toutes les fonctionnalités de toutes les applications, pour ceci elle dispose de quatre méthodes [MAR 98]:
GetTypeInfo( ) qui retourne un pointeur vers les informations de type d’un objet (interface) présenté par l’objet,
GetTypeInfoCount() qui signale si l’objet dispose ou non d’informations de type,
GetIDsOfNames() qui retourne le DISPID d’une méthode ou de paramètres à partir du nom,
Invoke() qui permet d’appeler une méthode à partir de son DISPID et d’un pointeur sur une structure contenant les paramètres à passer à la méthode.
2.11.3 Implémentation de l’interface IDispatch
Lors de la création d’un objet COM intégrant l’interface IDispatch, deux possibilités sont envisageables [MAR 98] :
Soit l’utilisation d’une interface IDispatch pure,
Soit l’utilisation d’une interface IDispatch duale.
L’interface IDispatch pure est basée uniquement sur une interface appelée “DispInterface”. Les méthodes de l’objet ne sont alors accessibles que par IDispatch::Invoke().
Pour définir une “DispInterface” en langage IDL, il suffit de remplacer l’instruction interface par dispinterface. On remarquera que l’on peut retourner directement la “vraie” valeur d‟une fonction.
L’objet COM ne peut alors présenter qu’une seule interface personnalisée.
[ uuid(10000001-0000-0000-0000-000000000001) ]
dispinterface Iperso
{
properties:
[id(1)] int x;
[id(2)] int y;
methods:
[id(3)] int somme(int x, int y);
};
Par contre, l’interface IDispatch duale est une interface à la fois basée sur IDispatch et sur la gestion des méthodes des interfaces personnalisées via la VTBL. Cela permet à une application client d’accéder à ses fonctionnalités soit via IDispatch soit via son interface personnalisée.
Dans le cas du passage par IDispatch, il n’est possible d’exposer qu’une seule interface personnalisée. Le code IDL correspondant à une interface IDispatch duale avec interface Iperso définie précédemment est alors le suivant :
[ object, uuid(10000001-0000-0000-0000-000000000001), dual ]
interface Iperso : IDispatch
{
[id(1)] HRESULT Somme(int x, int y, [out, retval] int* retval);
}
Page suivante : 2.12 Les avantages et les inconvénients de COM
Retour au menu : UTILISATION DES SCRIPTS POUR LE DEVELOPPEMENT DES COMPOSANTS COM ADAPTABLES