1. Petitrappel sur les objets
Dabord quest-ce quun objet (pour ceux qui auraientoubliés lol) ? Un objet , cest un ensemble de données et de traitementssur les données.
Les données sont privées à lobjet, cest-à-dire que lesdonnées ne sont accessibles que de lintérieur de lobjet. Le seul moyen pourmontrer les données au « reste du monde » est dutiliser lespropriétés qui permettent de lire et décrire dans les données internes. On litavec Property Get et on écrit avec Property Let (ouProperty Set pour écrire une référence dobjet).
Les traitements sont réalisées par des fonctions ou desprocédures qui sont appelées méthodes. On peut définir des méthodes privéespour des traitements internes mais il est nécessaire dexposer publiquement desméthodes afin de pouvoir donner « une vie » à lobjet.
2. Lesobjets COM
COM est une modélisation objet. Elle permet de contrôler lecycle de vie de lobjet et repose sur un certain nombre de concepts dontnotamment la notion dinterface
- Une interface permet à un objet dexposer ses fonctionnalités : cest une liste de propriétés et de méthodes. Il est identifié de façon unique par GUID.
1. Automation
Automation est une technologie permettant à un serveurdexposer des objets à des clients qui les consomment. Par exemple, Excelexpose sont objet application afin de pouvoir contrôler des classeur.
2. Les modules de classe
Un module de classe VB est à la fois le définition delinterface de lobjet (un typage en quelque sorte) et limplémentation desfonctionnalités.
Lorsque lon veut utiliser lobjet, il faut linstancier àlaide de la fonction New. Cela déclenche le constructeur Class_Initializedu module de classe.
Lorsque lon na plus besoin de lobjet, on écrit Setobjet = Nothing. Cela permet de libérer les ressources de lobjetet déclenche le destructeur Class_Terminate.
Le polymorphisme est la faculté dun objet à exposer uneinterface différente suivant la demande. Sous VB, il simplémente avec le motclé Implements. Lobjet gérera son interface plus toutes les interfacesdéfinies par Implements.
Lhéritage est bien sous VB se nest rien : VB ne legère pas dans le langage. Mais derrière la scène tout objet est un héritage deplusieurs interfaces. En résumé, un héritage est un rajout des données et deméthodes. Le père a des données et des méthodes. Le fils, qui hérite du père ales données et les méthodes du père et ses propres données et méthodes. Etainsi de suite
Toute méthode a un premier paramètre caché qui un pointeurvers linstance de lobjet, donc la structure de lobjet, pour lequel laméthode a été appelé. Sous VB, il sappelle Me et en C++, on lappellecommunément This
3. Quest ce quun objet pour VB
VB est un client Automation qui permet dutiliser des objetsCOM et den concevoir dautres.
Un objet pour VB est le type Object. Mais quest ceque le type Object en réalité. Eh bien, cest un pointeur vers unestructure. La seule différence avec une structure classique, cest le premiermembre qui est un pointeur vers un tableau de pointeur vers les méthodes delobjet, appelé vtable (pour Virtual Function Table).Les membre suivant sont les données de lobjet. Le type Object a à labase, 7 fonctions qui ne lui permettent rien dautre que dexister. Nous allonsvoir tout de suite le détail de ces fonctions.
4. Linterface IUnknown : la notion COM du cycle de vie dunobjet
Cette interface est la base dun objet COM.
Tout objet supporte linterface IUnknown afinde pouvoir gérer la construction et la destruction dobjets et le référencementdes instances de lobjet. Cet interface nest pas directement le type Objectmais sert à sa définition par le biais de lhéritage.
Il comporte 3 méthodes qui renvoient toutes un Long (enfait un HRESULT):
- QueryInterface
- AddRef
- Release
QueryInterface a trois paramètre :
- This qui pointe vers la structure de lobjet
- Refiid est le GUID de linterface que linstance de lobjet a créé doit implémenté
- ppvObj est pointe vers un pointeur pour contenir la référence dun objet de type du GUID
Cette fonction permet de gérer le polymorphisme : unobjet peut implémenter plusieurs interfaces.
Si lobjet supporte linterface, elle renvoie 0 (S_OK) etremplit ppvObj avec ladresse de linstance du type correspondant au GUID.
SI lobjet ne supporte pas linterface, elle renvoieE_NOINTERFACE et 0 dans ppvObj.
Elle nest pas toujours appelée par VB car en générale, elleest lente.
AddRef et Release ont un seulparamètre : le pointeur This.
- AddRef permet de dire à lobjet que lon a un pointeur (une référence) de plus vers lui. Cela incrémente un compteur interne qui permet de savoir combien de références de lobjet vivent.
- Release permet de dire à lobjet que lon vient déliminer un pointeur (une référence) vers lui. Cela décrémente le compteur interne. Lorsquil atteint 0, lobjet est libéré ainsi que ses ressources.
Tout appel à QueryInterfaceet AddRef doit être compenser avec un appel à Release.
IUnknown permet donc dimplémenter la naissance et lamort de lobjet. Il na pas déquivalent directe dans VB mais est à la base dutype Object. Bien que VB ne le gère pas directement en tant que type, ilsait très bien lutiliser dans les interfaces qui ne sont pas Object debase.
Beaucoup dinterfaces de Windows dérivent (par héritage) dece type.
5. Linterface IDispatch
Un pointeur vers ce type est le type Object = IDispatch*.
Cette interface permet dexposer des objets verslextérieur, comme Excel ou Word, par exemple, sans forcement connaître àlavance sont interface. Il permet de gérer les instances dobjets obtenues parles fonction GetObject et CreateObject.
Elle comporte 4 fonctions :
- Les deux premières servent à définir le type de lobjet : ses propriétés, ses méthodes
Ceux sont GetTypeInfo et GetTypeInfoCount.
- Les deux suivantes servent à lappel des propriétés et méthodes. Ceux sont GetIDsOfNames et Invoke que nous détaillerons dans la section Liaison.
Cette interface permet de gérer la liaison tardive (àlexécution), cest à dire que les méthodes ne sont pas appelées directementmais uniquement par le biais de cette interface. Cela permet de gérer des nomsde méthodes dynamiquement. Cest aussi par cette interface que CallByNamepasse pour les appels de méthodes. Cela permet de ne rien connaître delinterface de lobjet à la compilation : seul le programmeur connaît lesparamètres des méthodes de linterface. Le compilateur générera le codenécessaire a cette absence dinformation.
Cette interface implémente aussi à la gestion desévènements.
6. Les liaisons
Une liaison est le fait de relier une méthode ou unepropriété à son instance dobjet. Plus simplement cest le point quevous tapez dans VB : par exemple App.Path, le point relie la propriétéPath à son instance dobjet App.
Il existe deux types de liaisons :
- Les liaisons anticipées (vtable binding et early-id binding) effectuées par le compilateur
- Les liaisons tardives (late binding) effectuées à lexécution par linterface IDispatch
1) Le vtablebinding
Lorsque vous appuyez sur le point, lIntelliSensesaffiche avec la liste des méthodes et propriétés.
Il est utilise lorsque lon connais lemplacement exacte desméthodes et propriétés de linterface. Cest le cas des interfaces ayant une vtable connue à la comilation,notament ceux dérivant seulement de IUnknown. Linterface fournit toutes lesinformations nécessaires aux compilateur pour appeler les méthodes par leuradresses contenues dans la vtable (le premier membre de la structure delobjet). Il réalise un simple CALL (instruction asm) avec ladresse de laméthode.
Cela donne quelque chose dans le genre de : ptrObj estun pointeur vers lobjet (un pointeur fait 4 octets)
MOVEAX,[ptrObj] //met dans EAX ladressedu début de la vtable
MOVEAX,[EAX + 4 * i] //met dans EAX ladresse de la i-ème méthode de lobjet
CALL EAX//appel directement la méthode
Cette méthode de liaison est très rapide à lexécution.
2) Le early-id binding
Lorsque vous appuyez sur le point, lIntelliSensesaffiche avec la liste des méthodes et propriétés.
Ce type de liaison se produit lorsque lobjet supportelinterface IDispatch et que lon connaît linterface de lobjet mais paslemplacement des méthodes dans la vtable. On connaît par contre unidentifiant permettant dutiliser la méthode Invoke de linterface IDispatchafin dappeler la méthode visée.
Le compilateur est donc capable de trouver lid de laméthode et de passer directement cet id à la méthode Invoke (sans passerpar un appel à la méthode GetIDsOfNames).
Ce type de liaison est déjà beaucoup moins rapidedans la mesure où lon passe par la méthode Invoke.
3) Le late binding
Lorsque vous appuyez sur le point, lIntelliSensene saffiche pas.
Il correspondant au type As Object : pource type, on ne connais que sa capacité à gérer IDispatch mais pas letype de lobjet.
Avec ce type de liaison le compilateur ne connaît rien surlinterface de lobjet si ce nest quil supporte linterface IDispatchpour les appels à ses méthodes. Cest le cas lorsque lon affecte à unevariable As Object le résultat dun CreateObject. On ensait pas vraiment le type de lobjet que lon obtient.
On sait que lon va obtenir une interface de contrôledExcel en faisant Set obj = CreateObject(« Excel.Application »)mais on ne connaît pas ses méthodes et propriétés puisque lon na pas labibliothèque de type dans laquelle linterface est défini.
Un appel a une méthode de lobjet se passe comme suit :
- un appel à la méthode GetIdsOfNames qui permet dobtenir un identifiant pour le nom de la méthode à appeler
- un appel à la méthode Invoke permet dappeler effectivement la méthode ou la propriété en question
Ce mode de liaison est donc très lent.
Conseil : pour réduire le nombre de liaison, utiliserle plus possible With qui fait une copie de la référence de lobjet avant de selier avec ses méthodes. Le code en sera clarifier et très largement accélérer.
7. Conclusion
Dabord félicitation si vous êtes arrivé jusque là
Mais, vous allez sûrement me dire : « Oui, etalors, on en fait quoi de tout ça ». Eh bien, ce tutoriel nest quuneintroduction aux objets COM quutilise VB. Notez aussi le faitque si vous déclarer une variable IUnknown ou IDispatch, vous ne pourraitpas appeler ses méthodes car VB nest pas conçu pour vous laisser gérer toutcela. Et heureusement, car cest lui qui fait cette partie complexe du travail.Notez enfin, quappeler les méthodes ne vous servirait à rien.
Je vous entends déjà dire « Eh bien alors ca ne sertà rien ! ». A cela, je réponds que cela vous prépare au concept dobjet« léger »
Mais cela fait partie du tutoriel suivant