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.