Automation et interfaces duales

Automation (originalement appelé OLE Automation) est une technologie qui permet à un composant logiciel d'exposer ses fonctionnalités à une autre application.

Le lien est la manière dont l'application cliente Automation controller, va accéder aux interfaces disponibles du composant serveur Automation server. Les deux notions Automation controller et Automation server sont très parlantes. Le composant Compo met à disposition des interfaces (on peut donc considérer que c'est un serveur), destinés à être utilisées par l'application App (qui représente l'application contrôleur, celle qui va agir sur l'objet automate de Compo).

Le modèle COM permet à un composant d'exposer ses interfaces de deux manières :

  • à partir de table de lien directe VTable, on parle de liaison précoce early binding,
  • à travers l'interface normalisée IDispatch, on parle de liaison tardive late binding.

Les performances varient selon le type de lien. La liaison précoce offre une meilleure performance, avec cette méthode les fonctions sont appelées directement. A l'inverse la liaison tardive des symboles est effectuée au moment du chargement d'un programme, ou au moment de l'utilisation du symbole par le biais de la méthode IDispatch.Invoke. Les deux techniques sont pour autant utiles dans des scénari différents, Visual Basic permet d'utiliser les deux types de liens.

Liaison précoce

La liaison précoce est la solution plus performante, elle intervient lors de la compilation. Lors de l'exécution du code, Visual Basic n'a plus à se soucier de l'exactitude des informations liées à l'objet concerné.

Elle s'implémente de la façon suivante :

Dim obj As Compo.Interface
Set obj = New Compo.Interface

Cependant, tous les composants serveurs ne supportent pas ce type de binding. Il faut en effet que le composant possède une librairie référencant les objets, méthodes et autres propriétés liés à l'objet auquel veut accéder l'application contrôleur.

Liaison tardive

La liaison tardive se déroule lors de l'exécution du programme. Lorsque l'application contrôleur tente d'accéder à des ressources du composant, Visual Basic doit vérifier si ces objets, méthodes, fonctions, existent et si cette demande est correctement formulée.

Elle s'implémente de la façon suivante :

Dim obj As Object
Set obj = CreateObject("Compo.Interface")

Ce type de liaison est moins performante, en effet Visual Basic doit ici vérifier à chaque fois que l'objet Obj est utilisé si ses méthodes, propriétes, sont employées correctement. Cela implique des contrôles au niveau du système d'exploitation ainsi qu'au niveau du composant qui fournit l'objet en question. De plus, Visual Basic ne connaissant pas le type d'objet auquel fait référence Obj avant l'exécution, il doit prévoir une quantité de mémoire suffisante, donc surévaluée.

Les interfaces d’énumération

Afin d'énumérer les éléments d'un type particulier que maintient un objet, COM fournit un ensembles d'interfaces d'énumération, une pour chaque type d'élément.

Pour utiliser ces interfaces, le client demande à un objet qui maintient une collection d'élément de créer un énumérateur d'objet. L'interface d'un énumérateur d'objet est l'une des interfaces d'énumérations, toutes sur la forme d'IEnum_XXXX/. La seule différence entre les interfaces d'énumérations est ce qu'elle énumère (il doit exister une interface d'énumération séparée pour chaque type d'élément énuméré). Toutes disposent des mêmes méthodes : Next, Skip, Reset et Clone.

L'interface IEnumFORMATETC énumère les différents format que supporte l'objet lors d'une opération de transfert de données commme le presse papier ou le drap and drop.

L'interface IEnumMoniker énumère les composants d'un moniker ou les différents monikers d'une table de moniker.

L'interface IEnumOLEVERB enumére les différents verbes disponible d'un objet dans l'ordre ascendant de l'index. A énumérateur qui implémente l'interface IEnumOLEVERB est renvoyé par IOleObject.EnumVerbs.

L'interface IEnumSTATSTG fournit une méthode pour énumérer une structure STATSTG qui contient des informations statistiques d'un objet de stockage, de flux ou un tableau d'octets.

L'interface IEnumVARIANT fournit une méthode pour énumérer une collection de variants, y compris des collections hétérogènes d'objets et de type intrasèque. L'appelant de cet interface n'a pas besoin de connaître le type spécifiques des éléments de la collection.

Les interfaces de description de type (ITypeLib, ITypeInfo)

Les interfaces de description de type fournissent un moyen pour lire et/ou se relier aux descriptions des objets d'une bibliothèque de type. Ces descriptions sont utilisées par les clients des contrôles ActiveX lorsque qu'ils parcourent, créent ou manipulent les objets ActiveX (Automation). Le projet COM help est un bon exemple de l'utilisation des interfaces ITypeLib et ITypeInfo.

L'interface ITypeLib permet d'accéder aux informations de type d'un objet.

L'interface ITypeInfo permet d'accéder aux informations de définition des interfaces d'un objet.