Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LES OBJETS COM ET VB


Information sur le tutorial

Catégorie :Optimisation du code Date de création : 28/06/2005 16:25:45 Vu : 7 581 fois

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


Description

Ceci est une introduction aux fonctionnements internes des objets COM et donc VB. Ceci a pour but d'introduire aux objets légers pour eux-même et pour les pointeurs de fonctions. Il est conseillé d'avoir quelques notion de C et d'assembleur et de programmation objet. Bonne lecture...

Tutorial

1.      Petitrappel sur les objets

 

D’abord qu’est-ce qu’un objet (pour ceux qui auraientoubliés lol) ? Un objet , c’est un ensemble de données et de traitementssur les données.

Les données sont privées à l’objet, c’est-à-dire que lesdonnées ne sont accessibles que de l’intérieur de l’objet. Le seul moyen pourmontrer les données au « reste du monde » est d’utiliser 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 d’objet).

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 d’exposer publiquement desméthodes afin de pouvoir donner « une vie » à l’objet.

 

2.      Lesobjets COM

COM est une modélisation objet. Elle permet de contrôler lecycle de vie de l’objet et repose sur un certain nombre de concepts dontnotamment la notion d’interface

  • Une interface permet à un objet d’exposer ses fonctionnalités : c’est 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 serveurd’exposer 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 del’interface de l’objet (un typage en quelque sorte) et l’implémentation desfonctionnalités.

Lorsque l’on veut utiliser l’objet, il faut l’instancier àl’aide de la fonction New. Cela déclenche le constructeur Class_Initializedu module de classe.

Lorsque l’on n’a plus besoin de l’objet, on écrit Setobjet = Nothing. Cela permet de libérer les ressources de l’objetet déclenche le destructeur Class_Terminate.

Le polymorphisme est la faculté d’un objet à exposer uneinterface différente suivant la demande. Sous VB, il s’implémente avec le motclé Implements. L’objet gérera son interface plus toutes les interfacesdéfinies par Implements.

L’héritage est bien sous VB se n’est 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 l’instance de l’objet, donc la structure de l’objet, pour lequel laméthode a été appelé. Sous VB, il s’appelle Me et en C++, on l’appellecommunément This

 

3.     Qu’est ce qu’un objet pour VB

VB est un client Automation qui permet d’utiliser des objetsCOM et d’en concevoir d’autres.

Un objet pour VB est le type Object. Mais qu’est ceque le type Object en réalité. Eh bien, c’est un pointeur vers unestructure. La seule différence avec une structure classique, c’est le premiermembre qui est un pointeur vers un tableau de pointeur vers les méthodes del’objet, appelé vtable (pour Virtual Function Table).Les membre suivant sont les données de l’objet. Le type Object a à labase, 7 fonctions qui ne lui permettent rien d’autre que d’exister. Nous allonsvoir tout de suite le détail de ces fonctions.

 

4.     L’interface IUnknown : la notion COM du cycle de vie d’unobjet

Cette interface est la base d’un objet COM.

Tout objet supporte l’interface IUnknown afinde pouvoir gérer la construction et la destruction d’objets et le référencementdes instances de l’objet. Cet interface n’est pas directement le type Objectmais sert à sa définition par le biais de l’hé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 l’objet
  • Refiid est le GUID de l’interface que l’instance de l’objet a créé doit implémenté
  • ppvObj est pointe vers un pointeur pour contenir la référence d’un objet de type du GUID

Cette fonction permet de gérer le polymorphisme : unobjet peut implémenter plusieurs interfaces.

Si l’objet supporte l’interface, elle renvoie 0 (S_OK) etremplit ppvObj avec l’adresse de l’instance du type correspondant au GUID.

SI l’objet ne supporte pas l’interface, elle renvoieE_NOINTERFACE et 0 dans ppvObj.

Elle n’est 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 à l’objet que l’on 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 l’objet vivent.
  • Release permet de dire à l’objet que l’on vient d’éliminer un pointeur (une référence) vers lui. Cela décrémente le compteur interne. Lorsqu’il atteint 0, l’objet est libéré ainsi que ses ressources.

Tout appel à QueryInterfaceet AddRef doit être compenser avec un appel à Release.

IUnknown permet donc d’implémenter la naissance et lamort de l’objet. Il n’a 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 l’utiliser dans les interfaces qui ne sont pas Object debase.

Beaucoup d’interfaces de Windows dérivent (par héritage) dece type.

 

5.     L’interface IDispatch

Un pointeur vers ce type est le type Object = IDispatch*.

Cette interface permet d’exposer des objets versl’extérieur, comme Excel ou Word, par exemple, sans forcement connaître àl’avance sont interface. Il permet de gérer les instances d’objets obtenues parles fonction GetObject et CreateObject.

Elle comporte 4 fonctions :

  • Les deux premières servent à définir le type de l’objet : ses propriétés, ses méthodes… Ceux sont GetTypeInfo et GetTypeInfoCount.
  • Les deux suivantes servent à l’appel 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 (àl’exécution), c’est à 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. C’est aussi par cette interface que CallByNamepasse pour les appels de méthodes. Cela permet de ne rien connaître del’interface de l’objet à la compilation : seul le programmeur connaît lesparamètres des méthodes de l’interface. Le compilateur générera le codenécessaire a cette absence d’information.

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 d’objet. Plus simplement c’est le point quevous tapez dans VB : par exemple App.Path, le point relie la propriétéPath à son instance d’objet 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 à l’exécution par l’interface IDispatch

 

1)     Le vtablebinding

Lorsque vous appuyez sur le point, l’IntelliSenses’affiche avec la liste des méthodes et propriétés.

Il est utilise lorsque l’on connais l’emplacement exacte desméthodes et propriétés de l’interface. C’est le cas des interfaces  ayant une vtable connue à la comilation,notament ceux dérivant seulement de IUnknown. L’interface fournit toutes lesinformations nécessaires aux compilateur pour appeler les méthodes par leuradresses contenues dans la vtable (le premier membre de la structure del’objet). Il réalise un simple CALL (instruction asm) avec l’adresse de laméthode.

Cela donne quelque chose dans le genre de : ptrObj estun pointeur vers l’objet (un pointeur fait 4 octets)

            MOVEAX,[ptrObj]  //met dans EAX l’adressedu début de la vtable

            MOVEAX,[EAX + 4 * i] //met dans EAX l’adresse de la i-ème méthode de l’objet

            CALL EAX//appel directement la méthode

Cette méthode de liaison est très rapide à l’exécution.

 

2)     Le early-id binding

Lorsque vous appuyez sur le point, l’IntelliSenses’affiche avec la liste des méthodes et propriétés.

Ce type de liaison se produit lorsque l’objet supportel’interface IDispatch et que l’on connaît l’interface de l’objet mais pasl’emplacement des méthodes dans la vtable. On connaît par contre unidentifiant permettant d’utiliser la méthode Invoke de l’interface IDispatchafin d’appeler la méthode visée.

Le compilateur est donc capable de trouver l’id 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ù l’on passe par la méthode Invoke.

 

3)     Le late binding

Lorsque vous appuyez sur le point, l’IntelliSensene s’affiche pas.

Il correspondant au type As Object : pource type, on ne connais que sa capacité à gérer IDispatch mais pas letype de l’objet.

Avec ce type de liaison le compilateur ne connaît rien surl’interface de l’objet si ce n’est qu’il supporte l’interface IDispatchpour les appels à ses méthodes. C’est le cas lorsque l’on affecte à unevariable As Object le résultat d’un CreateObject. On ensait pas vraiment le type de l’objet que l’on obtient.

On sait que l’on va obtenir une interface de contrôled’Excel en faisant Set obj = CreateObject(« Excel.Application »)mais on ne connaît pas ses méthodes et propriétés puisque l’on n’a pas labibliothèque de type dans laquelle l’interface est défini.

Un appel a une méthode de l’objet se passe comme suit :

  • un appel à la méthode GetIdsOfNames qui permet d’obtenir un identifiant pour le nom de la méthode à appeler
  • un appel à la méthode Invoke permet d’appeler 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 l’objet avant de selier avec ses méthodes. Le code en sera clarifier et très largement accélérer.


7.     Conclusion

D’abord 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 n’est qu’uneintroduction aux objets COM qu’utilise VB. Notez aussi le faitque si vous déclarer une variable IUnknown ou IDispatch, vous ne pourraitpas appeler ses méthodes car VB n’est pas conçu pour vous laisser gérer toutcela. Et heureusement, car c’est lui qui fait cette partie complexe du travail.Notez enfin, qu’appeler 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 d’objet« léger »… Mais cela fait partie du tutoriel suivant…

signaler à un administrateur
Commentaire de ShareVB le 05/07/2005 11:47:21

Je cite ma source, tout en disant que ce n'est pas du copier coller, ni du texte, ni du code :

Advanced Visual Basic 6
Power Techniques for Everyday Programs
Matthew Curland
www.powervb.com

Si vous voulez encore plus d'infos sur VB, achetez et lisez ce livre...

ShareVB

signaler à un administrateur
Commentaire de MadM@tt le 20/02/2006 01:21:10

Rolalalala
Quel tutoriel monstrueux, ça ne pouvait etre que du ShareVB ^^ ! C'est la ou on se rend compte qu'on y connais rien à VB lol!
Franchement,meme s'il y a plus de théorie que de pratique, c'est excellent, ça permet d'apprendre et comprendre plein plein de choses.
Un grand merci pour ce tutoriel !

Mais comme tu le dis, dommage ça n'est d'aucune utilité pratique.
A+

signaler à un administrateur
Commentaire de ShareVB le 11/08/2006 21:42:44

salut à tous,

retrouvez ce tuto sur mon site perso à www.sharevb.net...rubrique Programmation\VB\

ShareVB

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,000 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.