Méthodes

Une méthode COM a presque les mêmes caractéristiques qu'une méthode Oxygène++ en L4G. Deux différences majeures existent toutefois. La première est le fait que les types de données sont différents puisque la librairie COM de base utilise les types de données C++ et non L4G. La deuxième différence provient du fait qu'il existe deux types de méthodes en C++ : les procédures et les fonctions.

Les procédures prennent des paramètres en arguments, et renvoie le résultat en modifiant ces paramètres.

Les fonctions prennent des arguments en paramètres, et ne renvoient (le plus souvent) qu'un seul résultat, sans modifier les paramètres. On peut imaginer en regardant un fichier source, que le texte représentant l'appel à une fonction est remplacé après l'appel, par le résultat de la fonction. Ceci autorise l'appel à des fonctions emboîtées. Regardons de plus près.

 

Procédures

 

        Inverser (int &a, int &b) ;

 

La procédure nommée « Inverser » prend deux paramètres entiers (int) nommés a et b. Cette procédure a pour but d'inverser les valeurs de ces deux variables. Ainsi, si a vaut 2 et b vaut 5 avant l'appel à Inverser, a vaudra 5 et b vaudra 2 après l'appel.

Il est possible d'imaginer d'ajouter un paramètre pour obtenir un résultat. Prenons une procédure qui est pour but de calculer la somme de deux entiers :

 

        Somme (int a, int b, int &c) ;

 

Cette procédure ajoute les deux entiers (type int) a et b et rend le résultat dans le troisième paramètre entier c.

Remarque : tous les paramètres renvoyant un résultat sont précédés d'un « et commercial » (&).

 

Fonctions

 

        int Somme (int a, int b) ;

 

La fonction Somme ne prend que deux paramètres a et b, et renvoie le résultat sous forme d'une variable (non nommée) de type entier. Le type de retour est noté à gauche.

L'avantage est qu'il est possible d'imbriquer deux appels à la fonction Somme :

 

        d = Somme(a, Somme(b, c)) ;

 

Afin d'appeler la fonction Somme la plus à gauche, le compilateur doit d'abord évaluer l'ensemble des paramètres. Pour cela, il doit chercher la valeur de a, puis appeler la deuxième fonction Somme avec les paramètres b et c. Ce premier appel va rendre un résultat qui sera passé en paramètre à la fonction Somme la plus à gauche. Ce n'est qu'en dernier lieu que la variable d sera affectée au résultat final.

 

 

 

 

Types de données

Les types de données utilisés sont ceux du C. Voici une liste des types C les plus utilisés :

 

Types C
Interprétation
int

entier

long

entier long

float

réel

double

réel double précision

char

caractère

char *

chaîne de caractères

void *

pointeur

 

Or, COM dispose d'une interface spécialisée dans l'appel de méthodes du serveur, qui sont inconnues au moment de la compilation. C'est cette interface qui est utilisée par OXYGENE ++. Les types de données sont totalement différents :

 

 

Types COM

Interprétation

VT_EMPTY

Vide

VT_NULL

Vide style SQL

VT_I2

Entier signé sur 2 octets

VT_I4

Entier signé sur 4 octets

VT_R4

Réel sur 4 octets

VT_R8

Réel sur 8 octets

VT_CY

Monnaie

VT_DATE

Date

VT_BSTR

Chaîne de caractères OLE Automation

VT_DISPATCH

Pointeur sur une interface IDispatch

VT_ERROR

SCODE (code d'erreur HRESULT)

VT_BOOL

Booléen Vrai=-1, Faux=0

VT_VARIANT

Pointeur sur une variable

VT_UNKNOWN

Pointeur sur une interface

VT_I1

Entier signé sur 1 octet (ou caractère)

VT_UI1

Entier non signé sur 1 octet ou caractère

 

Remarque : une étoile * après un type signifie soit pointeur sur ce type, soit tableau de ce type. Ces notions n'existent pas en L4G.

(Correspondance entre les types COM et L4G)

Pour en savoir plus : Description des types de données COM en C++.

Librairies de Types

Ces librairies contiennent, sous un format binaire, la description de l'ensemble des interfaces et types de données mis à disposition par le serveur COM. Elles donnent aussi la liste des interfaces directement accessibles, appelées coclass (component class). Les interfaces n'étant pas dans la liste des coclass, sont accessibles via l'appel de méthodes d'une au moins des coclass.

 

Une librairie de types (Type Library en anglais) se présente sous la forme d'un fichier binaire avec l'extension .tlb ou .olb. Ce fichier est généré à l'aide de la définition des interfaces du serveur. Cette définition est écrite dans un langage spécialisé dans la définition d'interfaces. Ce langage peut être soit IDL (Interface Definition Language), soit ODL (Object Definiton Language). Deux outils permettent d'utiliser les fichiers écrits à l'aide de ces langages : il s'agit de mktypelib et de MIDL.

 

Les librairies de types sont construites en même temps que certains fichiers sources (souvent en C++) qui sont utiles au serveur et aux clients désireux d'utiliser directement les méthodes mises à disposition par le serveur (sans passer par l'interface Idispatch)

Les librairies de types sont utilisées par des visualiseurs de serveurs COM (notamment l' « OLE / COM Object Viewer ») et par les clients utilisant l'interface IDispatch.