Utilisation de liaison anticipée et liaison tardive dans Automation

Traductions disponibles Traductions disponibles
Numéro d'article: 245115 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Comment vous liez à un serveur Automation peut affecter de nombreux facteurs dans votre programme, tel que les performances, de flexibilité et facilité de gestion.

Cet article présente les types de liaison disponible pour les clients Automation et weighs les deux côtés de chaque méthode.

Plus d'informations

Automation est un processus où un composant logiciel communique avec et/ou contrôles d'un autre composant de logiciel à l'aide de Microsoft (Component Object Model). Il sert de base pour la plupart des communications inter-composant utilisée dans des langages tels que Visual Basic ou Visual Basic pour Applications et a deviennent une partie normale de la plupart des programmes.

Historiquement, un objet Automation est n'importe quel objet qui prend en charge le IDispatch interface. Cette interface permet aux clients d'appeler les méthodes et propriétés lors de l'exécution sans connaître l'objet exact qu'ils sont communiquer avec au moment du design ; un processus appelé liaison tardive. Aujourd'hui, cependant, le terme qu'objet Automation pouvant être appliquées à pratiquement n'importe quel objet COM, même ceux qui ne prennent pas en charge IDispatch (et ne peut donc pas être en retard lié). Cet article suppose que l'objet que vous êtes Automatisation prend en charge deux méthodes de liaison.

Ce qui effectue la liaison ?

La liaison est un processus de correspondance des appels de fonction écrits par le programmeur qui implémente la fonction du code réel (internes ou externes). Elle est auditée lorsque l'application est compilée, et toutes les fonctions appelées dans le code doivent être liées avant l'exécution le code.

Pour comprendre le processus, pensez « liaison en termes de publication d'un livre. Imaginez que votre code est comme le texte de la loi où dans un paragraphe certain vous avez écrit une opération telle que « voir chapitre 12, page x pour plus d'informations ». Vous ne connaissez le numéro de page jusqu'à ce que le catalogue est terminé, ainsi, avant que le paragraphe peut être lue comme prévu, toutes les pages de la loi doivent être liés ensemble et le numéro de page correcte inséré dans le paragraphe. Vous attendre de la loi d'être « liée » avant de faire référence autres parties de la loi.

Liaison logiciels est similaire. Votre code est composé de parties qui doivent être extraites ensemble avant que le code peut être « lues. » La liaison est le fait de remplacer la fonction noms comportant des adresses mémoire (ou les décalages de mémoire pour être plus précis) où le code est « atteindre » lorsque la fonction est appelée. Pour les objets COM, l'adresse est un décalage de mémoire dans une table des pointeurs (appelé le vtable) détenu par l'objet. Lorsqu'une fonction COM est liée, il est lié via la vtable.

La structure d'un objet COM est simple. Lorsque votre code contient une référence à un objet, elle contient un pointeur indirect vers le haut de la vtable. Le v-table est un tableau des adresses de mémoire dans laquelle chaque entrée est une autre fonction qui peut être appelée sur cet objet. Pour appeler la fonction de troisième sur un objet COM, vous passer trois entrées dans la table vers le bas et puis accéder à l'emplacement mémoire donné il. Qui exécute le code de la fonction et, lorsqu'elle est terminée, vous renvoie en prêt à exécuter la ligne de code suivante.

+-[Code]------------+  +.................................[COM Object]...+
|                   |  : +-------------+                                :
|Set obj = Nothing -|--->| obj pointer |                                :
|                   |  : +-|-----------+                                :
+-------------------+  :   |   +-----------------+                      :
                       :   +-->| v-table pointer |                      :
                       :       +--|--------------+                      :
                       :          |                                     :
                       :          |  +----------------------------+     :
                       :  (3rd)   |  | Function 1 Address pointer |     :
                       : (Offset) |  +----------------------------+     :
                       :          |  | Function 2 Address pointer |     :
                       :          |  +----------------------------+     :
                       :          +->| Function 3 Address pointer |     :
                       :             +----------------------------+     :
                       +................................................+

				
l'exemple ci-dessus montre ce qui se produit lorsque la libération d'un objet COM. Étant donné que tous les objets COM héritent de IUnknown, les trois premières entrées dans la table sont les méthodes vers IUnknown. Lorsque vous devez libérer un objet, votre code appelle la fonction de troisième dans le tableau v (IUnknown::Release).

Heureusement, ce travail est effectué en Visual Basic en arrière-plan. Un programmeur Visual Basic, vous devez jamais traitent directement une vtable. Mais, cette structure est comment tous les objets COM sont liés, et il est important que vous êtes familiarisé avec lui pour comprendre la liaison est.

Liaison anticipée

L'exemple ci-dessus est ce qui est connu tôt (ou vtable) liaison. Pour que tous les objets COM, cette forme de la liaison se placer dès que l'interface de IUnknown de l'un objet COM est appelée. Mais qu'en est-il des autres fonctions de l'objet ? Comment vous appelez la méthode Refresh ou la propriété parent ? Ceux-ci sont des fonctions personnalisées qui sont généralement propres à un objet. Si les emplacements dans le v-table ne peut pas être supposés, comment trouver les adresses de fonction nécessaires à appeler ?

La réponse dépend bien sûr, si vous savez à l'avance ce à quoi ressemble vtable l'objet. Si vous le faites, vous pouvez effectuer le processus de liaison précoce même pour les méthodes personnalisées de l'objet comme vous l'avez fait à ses méthodes IUnknown. C'est ce que sert généralement par « liaison précoce. »

Pour utiliser une liaison anticipée dans un objet, vous devez savoir ce à quoi ressemble sa vtable. Dans Visual Basic, vous pouvez effectuer cela en ajoutant une référence à une bibliothèque de type qui décrit l'objet, son interface (v-table) et toutes les fonctions qui peuvent être appelées sur l'objet. Qui fait, vous pouvez déclarer un objet comme étant un certain type, puis définir et utiliser cet objet à l'aide le v-table. Par exemple, si vous souhaitez automatiser Microsoft Excel à l'aide d'une liaison anticipée, vous devez ajouter une référence à la « Microsoft Excel 8.0 bibliothèque d'objets » dans la boîte de dialogue Project|References et puis déclarer votre variable comme étant de type Excel.Application. Dès lors, tous les appels effectués à votre variable d'objet s'être anticipées :
' Set reference to 'Microsoft Excel 8.0 Object Library' in
' the Project|References dialog (or Tools|References for VB4 or VBA).

' Declare the object as an early-bound object
  Dim oExcel As Excel.Application

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via the v-table
  oExcel.Visible = True
				
cette méthode fonctionne très la plupart du temps, mais que se passe-t-il si vous ignorez exactement objet vous utiliserez au moment de la conception ? Par exemple, que se passe-t-il si vous devez parler complètement pour plusieurs versions d'Excel, ou peut-être pour un objet « inconnu ?

Liaison tardive

COM comprend IDispatch. Les objets qui implémentent IDispatch sont appelés un dispinterface (si elle est l'interface uniquement qu'ils prennent en charge) ou une interface double (s'ils ont également une interface personnalisée que vous pouvez très tôt lier). Les clients qui lier IDispatch sont appelés doit être « retard lié » car la propriété exacte ou la méthode qu'ils sont appel est déterminé lors de l'exécution Utilisation des méthodes de IDispatch pour les localiser. Retourner à l'exemple du carnet précédemment, considérez qu'il comme étant comme un commentaire vous dirige vers la table des matières dans laquelle vous devez « regarde « la page numéro au « lire temps » plutôt que de devoir il déjà imprimé comporte du texte.

La magie de l'interface est contrôlée par les deux fonctions : GetIDsOfNames et Invoke. La première fonction mappages de noms (chaînes) à un identificateur (appelé un dispid) qui représente la fonction. Une fois que vous connaissez le code de la fonction que vous voulez appeler, vous pouvez appeler en utilisant la fonction Invoke. Cette forme de l'appel de méthode est appelée liaison tardive.

Là encore, dans Visual Basic la façon dont vous spécifiez la façon dont l'objet est lié est par votre déclaration d'objet. Si vous déclarer une variable objet en tant que « objet » vous sont en fait, indiquant Visual Basic pour utiliser IDispatch et sont donc liaison tardive :
' No reference to a type library is needed to use late binding.
' As long as the object supports IDispatch, the method can 
' be dynamically located and invoked at run-time.

' Declare the object as a late-bound object
  Dim oExcel As Object

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via IDispatch
  oExcel.Visible = True
				
comme vous pouvez le constater, le reste de votre code est identique. La seule différence entre une liaison anticipée et liaison tardive (en termes de code que vous écrivez) est dans la déclaration de variable.

Il est important de noter que que « en retard lié » est la fonction appelée et non la façon dont elle est appelée. À partir de la discussion précédente sur la liaison en général, vous devriez remarquer que IDispatch lui-même est « anticipée: « qui est dire que Visual Basic effectue l'appel pour définir la propriété visible grâce à une entrée vtable (IDispatch::Invoke) comme il le ferait n'importe quel appel COM. L'objet COM est chargé de transfert l'appel de la fonction correcte pour rendre Excel visible. Cette indirection permet au Visual Basic client être compilé (qui est, lié à une adresse valide fonction) mais savez toujours pas la fonction exacte qui va faire le travail.

Liaison Dispid

Certains Automation clients (plus considérablement MFC et Visual Basic 3.0, mais également Visual Basic 5.0 et 6.0 avec respecter aux contrôles ActiveX) utiliser un formulaire hybride liaison tardive d'appelé liaison dispid. Si l'objet COM est connu au moment de la conception, le dispids pour les fonctions sont appelées peuvent être mis en cache et transmis directement à IDispatch::Invoke sans avoir à appeler GetIDsOfNames au moment de l'exécution. Cela peut augmenter considérablement les performances, car au lieu d'appels deux COM par fonction, il vous souhaitez d'en créer une.

Liaison Dispid n'est pas une option que vous pouvez généralement choisir dans Visual Basic 5.0 ou 6.0. Il est utilisé pour les objets qui sont référencés dans une bibliothèque de type mais ne contient pas une interface personnalisée (c'est-à-dire, les objets auxquels une dispinterface uniquement) et d'agréger des contrôles ActiveX, mais, en général, Visual Basic utilise au début de liaison n'importe où vous utiliseriez normalement dispid liaison.

Le formulaire de liaison dois-je utiliser ?

La réponse à cette question dépend autant de la conception de votre projet comme tout autre élément. Microsoft vous recommande de liaison anticipée dans presque tous les cas. Toutefois, il peut être raisons de choisir la liaison tardive.

Plus tôt de liaison est la méthode préférée. Il est le meilleur interprète car votre application lie directement à l'adresse de la fonction appelée et n'est aucune surcharge effectuant une recherche au moment de l'exécution. En termes de vitesse de l'exécution générale, il est au moins deux fois aussi rapide que la liaison tardive.

Liaison anticipée fournit également la sécurité de type. Lorsque vous avez une référence définie sur bibliothèque de type du composant, Visual Basic prend en charge IntelliSense pour vous aider code chaque fonction correctement. Visual Basic vous avertit également si le type de données d'un paramètre ou valeur de retour est incorrect, l'enregistrement de beaucoup de temps lorsque écrire et déboguer le code.

Liaison tardive est toujours utile dans les situations où l'interface exacte d'un objet est inconnu au moment de la conception. Si votre application cherche à parler avec plusieurs serveurs inconnus ou doit pour appeler des fonctions par un nom (à l'aide la fonction Visual Basic 6.0 CallByName par exemple) puis vous devez utiliser la liaison tardive. Liaison tardive est également utile pour contourner des problèmes de compatibilité entre plusieurs versions d'un composant a incorrectement modifiées ou adaptée son interface entre les versions.

Les avantages à liaison anticipée rendent le meilleur choix possible.

Maintenir la compatibilité entre plusieurs versions

Si vous utilisez un composant qui vous ne pas redistribuer avec votre package d'installation et de la version exacte vous communique avec lors de l'exécution, vous devez attention à liaison anticipée à une interface qui est compatible avec toutes les versions du composant, ou (dans certains cas) ne peut pas être garantie utiliser liaison tardive pour appeler une méthode qui peut-être exister dans une version particulière et échouer normalement si cette méthode n'est pas présente dans la version installée sur le système client.

Applications Microsoft Office offrent un bon exemple de ces serveurs COM. Les applications Office sont développera généralement leurs interfaces pour ajouter des nouvelles fonctionnalités ou des défauts précédents corrects entre les versions. Si vous souhaitez automatiser une application Office, il est recommandé que vous liez plus tôt à la version plus ancienne du produit que vous escomptez peut être installé sur système votre client. Par exemple, si vous devez pouvoir automatiser Excel 95, Excel 97, Excel 2000 et Excel 2002, vous devez utiliser la bibliothèque de type pour Excel 95 (XL5en32.olb) pour maintenir la compatibilité avec toutes les trois versions.

Les applications Office présentent également que modèles d'objet avec les interfaces doubles volumineuses peuvent pâtir limitations dans le regroupement sur des plates-formes. Pour votre code travailler mieux sur toutes les plates-formes, utiliser IDispatch. Pour plus d'informations sur la gestion compatibilité lorsque vous travaillez avec Office applications, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
247579 Utiliser DISPID liaison pour automatiser les applications Office possible

Références

Pour plus d'informations sur COM, v-tables et utilisez Automation, consultez les manuels suivants :
Rogerson, Dale, dans COM , MSPRESS, ISBN: 1-57231-349-8.

Curland, Matt, Advanced Visual Basic 6 , DevelopMentor, 0201707128.

Propriétés

Numéro d'article: 245115 - Dernière mise à jour: vendredi 11 mai 2007 - Version: 7.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office Ultimate 2007
  • Microsoft Office Enterprise 2007
  • Microsoft Office Professional 2007
  • Microsoft Office Professional Plus 2007
  • Microsoft Office Standard 2007
  • Microsoft Office Home and Student 2007
  • Microsoft Office Basic 2007
  • Microsoft Office 2003, All Editions
  • Microsoft Office XP Developer
  • Microsoft Office 2000 Developer
  • Microsoft Visual Basic 5.0 Édition professionnelle
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic 5.0 Édition Entreprise
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Mots-clés : 
kbmt kbautomation kbinfo KB245115 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 245115
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com