Se connecter avec Microsoft
S'identifier ou créer un compte.
Bonjour,
Sélectionnez un autre compte.
Vous avez plusieurs comptes
Choisissez le compte avec lequel vous voulez vous connecter.

Résumé

Cet article répond aux questions courantes sur l’automatisation de Microsoft Office à partir de Visual C++.

Informations supplémentaires

Table des matières

  1. Qu’est-ce que l’automatisation ?

  2. Je suis nouveau dans Automation, où puis-je trouver de bonnes ressources pour en savoir plus ?

  3. Existe-t-il différentes façons d’utiliser Automation ?

  4. Qu’est-ce que COM ?
     

  5. Comment faire attacher à l’instance en cours d’exécution d’une application Office ?

  6. Comment faire passer des paramètres facultatifs ?

  7. Comment faire intercepter les événements exposés par les applications Office ?
     

  8. Mon code d’automatisation est trop lent. Comment puis-je accélérer les choses ?

  9. Que signifient ces énormes valeurs d’erreur, comme -2147352573 ou 0x80030002 ?

  10. Qu’est-ce qu’une bibliothèque de types ?

  11. Mon code d’automatisation fonctionnait avec Microsoft Excel 95, mais échoue avec Microsoft Excel 97. Pourquoi ?

  12. Pourquoi l’application que j’automatise reste-t-elle en mémoire une fois mon programme terminé ?

  13. Je sais ce que je veux faire en tant qu’utilisateur d’application Microsoft Office, mais comment faire par programme à l’aide d’Automation ?

  14. Puis-je automatiser une application Microsoft Office incorporée ?

  15. Comment faire accéder aux propriétés de mon document dans un document Microsoft Office ?

Questions et réponses

  1. Qu’est-ce que l’automatisation ?

    Automation (anciennement OLE Automation) est une technologie qui vous permet de tirer parti des fonctionnalités d’un programme existant et de les incorporer dans vos propres applications. Par exemple, vous pouvez utiliser les fonctionnalités de vérification orthographique et grammaticale de Microsoft Word dans votre application sans que Microsoft Word soit visible par vos utilisateurs. Vous pouvez même utiliser tous les outils de graphique, d’impression et d’analyse de données Microsoft Excel. Cette technologie peut grandement simplifier et accélérer votre développement.
     

  2. Je suis nouveau dans Automation, où puis-je trouver de bonnes ressources pour en savoir plus ? Le chapitre 24 de « Inside Visual C++ » de David Kruglinski (ISBN:1-57231-565-2) fournit une vue d’ensemble générale ainsi que quelques exemples remarquables. En outre, la Base de connaissances Microsoft est une bonne source d’informations.
    Si vous préférez apprendre par exemple, consultez l’article suivant dans la Base de connaissances Microsoft :
     

    179706 Comment utiliser MFC pour automatiser Excel & créer/mettre en forme un classeur

  3. Existe-t-il différentes façons d’utiliser Automation ?

    Il existe trois façons d’utiliser Automation : MFC, #import et C/C++:
     

    • Avec MFC, utilisez le ClassWizard Visual C++ pour générer des « classes wrapper » à partir des bibliothèques de type Microsoft Office. Ces classes, ainsi que d’autres classes MFC, telles que COleVariant, COleSafeArray, COleException, simplifient les tâches d’Automation. Cette méthode est généralement recommandée par rapport aux autres, et la plupart des exemples de base de connaissances Microsoft utilisent MFC.

    • #import, une nouvelle directive qui est devenue disponible avec Visual C++ 5.0, crée des « pointeurs intelligents » VC++ à partir d’une bibliothèque de types spécifiée. Il est très puissant, mais souvent déconseillé en raison de problèmes de comptage de références qui se produisent généralement lorsqu’il est utilisé avec les applications Microsoft Office.

    • L’automatisation C/C++ est beaucoup plus difficile, mais parfois nécessaire pour éviter une surcharge avec MFC ou des problèmes liés à #import. Fondamentalement, vous travaillez avec des API telles que CoCreateInstance() et des interfaces COM telles que IDispatch et IUnknown.

    Il est important de noter qu’il existe de légères différences entre Automation et C++ par rapport à C simple, car COM a été conçu autour de la classe C++.
     

  4. Qu’est-ce que COM ?

    L’automatisation est basée sur le modèle COM (Component Object Model). COM est une architecture logicielle standard basée sur des interfaces et conçue pour que le code soit séparé en objets autonomes. Considérez-le comme une extension du paradigme de programmation orientée objet (POO), mais applicable à des applications distinctes. Chaque objet expose un ensemble d’interfaces, et toutes les communications avec un objet, telles que l’initialisation, les notifications et le transfert de données, se produisent via ces interfaces.

    COM est également un ensemble de services fournis par les bibliothèques de liens dynamiques (DLL) installées avec le système d’exploitation. L’automatisation utilise un grand nombre de ces services. Un exemple est le service « Marshaling », qui empaquette les appels de l’application cliente aux fonctions membres des interfaces de l’application serveur et les transmet, avec leurs arguments, à l’application serveur. Cela donne l’apparence que les interfaces du serveur sont exposées dans l’espace mémoire du client, ce qui n’est pas le cas lorsque le client est un .exe s’exécutant dans son propre espace de processus. Le marshaling récupère également les valeurs de retour des méthodes du serveur au-delà des limites du processus et en toute sécurité dans les mains de l’appel du client. De nombreux autres services essentiels à Automation sont fournis par les différentes bibliothèques COM. Les sources d’information à ce sujet incluent « Inside Ole - Second Edition » de Kraig Brockschmidt, ISBN 1-55615-843-2, « Inside COM » de Dale Rogerson - ISBN 1-57231-349-8, et « Automation Programmer’s Reference », ISBN 1-57231-584-9.

  5. Comment faire attacher à l’instance en cours d’exécution d’une application Office ?

    Utilisez l’API GetActiveObject(). Les serveurs Automation s’inscrivent eux-mêmes dans la table d’objets en cours d’exécution (ROT), via l’API RegisterActiveObject(). Les clients Automation peuvent accéder à l’instance en cours d’exécution avec du code tel que :

     

          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    

    REMARQUE : S’il existe plusieurs instances en cours d’exécution de l’application Office que vous souhaitez attacher, vous pouvez uniquement l’attacher à la première instance qui a été lancée à l’aide de l’API GetActiveObject().

    En théorie, vous pouvez itérer le ROT pour chaque instance individuelle, mais les applications Office ne s’inscrivent pas elles-mêmes si une autre instance est déjà dans le ROT, car le moniker pour lui-même est toujours le même (il n’a pas pu être distingué de toute façon). Cela signifie que vous ne pouvez pas attacher d’instance à l’exception de la première. Toutefois, étant donné que les applications Office inscrivent également leurs documents dans le ROT, vous pouvez l’attacher à d’autres instances en itérant le ROT à la recherche d’un document spécifique, en l’attachant, puis en obtenant l’objet Application à partir de celui-ci.
    Vous n’aurez pas besoin de le faire pour PowerPoint, car il s’agit d’une application à instance unique . vous ne pouvez avoir qu’une seule instance de celui-ci en cours d’exécution.

  6. Comment faire passer des paramètres facultatifs ?

    Certaines méthodes ont des paramètres « facultatifs ». En Visual Basic, vous pouvez les omettre de manière informelle lors de l’appel de la méthode . Toutefois, lorsque vous appelez avec Visual C++, vous devez passer un variant spécial dont le champ .vt est VT_ERROR et le champ .scode est DISP_E_PARAMNOTFOUND. C'est:
     

          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    

    C’est vraiment ce que Fait Visual Basic en arrière-plan.

  7. Comment faire intercepter les événements exposés par les applications Office ?

    Fondamentalement, vous implémentez l’interface d’événement que vous souhaitez intercepter (le « récepteur ») et vous configurez une connexion de conseil avec l’application (la « source »).

    En général, pour configurer la connexion de conseil, vous obtenez le IConnectionPointContainer du serveur et appelez FindConnectionPoint() avec l’IID de l’interface d’événement. Cela vous donne une interface IConnectionPoint et il ne vous reste plus qu’à appeler Advise() avec une instance de votre interface d’événement. Le serveur rappelle ensuite via cette interface lorsque ces événements se produisent.

  8. Mon code d’automatisation est trop lent. Comment puis-je accélérer les choses ?

    L’une des causes courantes des problèmes de vitesse avec Automation est la lecture et l’écriture répétitives de données. C’est typique pour les clients Excel Automation. Toutefois, la plupart des gens ne savent pas que ces données peuvent généralement être écrites ou lues en même temps à l’aide de SAFEARRAY. Pour plus d’informations et des exemples informatifs, consultez l’article suivant de la Base de connaissances Microsoft :

    179706 GUIDE PRATIQUE : Utiliser MFC pour automatiser Excel et créer/mettre en forme un classeur
    En outre, il est important de souligner que l’utilisation du Presse-papiers peut parfois améliorer les performances. Par exemple, vous pouvez copier vos données dans le Presse-papiers, puis utiliser l’automatisation pour indiquer au serveur de coller. Ou vice versa; indiquez au serveur de copier dans le Presse-papiers et de le coller dans votre application.

  9. Que signifient ces énormes valeurs d’erreur, telles que -2147352573, ou 0x80030002 ?

    Ces valeurs sont appelées HRESULT et sont définies dans winerror.h. Les nombres sont si élevés, car le premier bit indique s’il s’agit ou non d’un résultat d’erreur. Vous pouvez utiliser l’utilitaire ErrLook.Exe fourni avec Visual C++ pour traduire ces nombres en descriptions explicites.

    Si vous souhaitez obtenir par programme une description des erreurs, vous pouvez utiliser l’API FormatMessage().

    REMARQUE : Si vous utilisez Visual C++ 6.0 et que vous avez une variable contenant cette valeur dans la fenêtre espion de débogage, ajoutez « , hr » (sans les guillemets) pour que Visual C++ la traduise pour vous !

  10. Qu’est-ce qu’une bibliothèque de types ?

    Une bibliothèque de types est similaire à un fichier d’en-tête C/C++. Il contient les interfaces, méthodes et propriétés qu’un serveur publie. Vous pouvez afficher la bibliothèque de types avec la visionneuse d’objets OLE/COM (Oleview.exe) fournie avec Visual C++. Voici une liste des noms de fichiers de bibliothèque de types pour Microsoft Office 95, 97 et 2000 :



    | d’application Office Bibliothèque de types
    ------------------------+----------------
    Word 95 et les | antérieures wb70en32.tlb
    Excel 95 et les | antérieures xl5en32.olb
    PowerPoint 95 et les | antérieures Powerpoint.tlb
    Access 95 et les | antérieures msaccess.tlb
    Binder 95 | binder.tlb
    Planification+ | sp7en32.olb
    | de projet pj4en32.olb
    | Team Manager mstmgr1.olb
    Word 97 | msword8.olb
    Excel 97 | excel8.olb
    PowerPoint 97 | msppt8.olb
    Access 97 | msacc8.olb
    Binder 97 | msbdr8.olb
    Graphique 97 | graph8.olb
    Outlook 97 | msoutl8.olb
    Outlook 98 | msoutl85.olb
    Word 2000 | msword9.olb
    | Excel 2000 excel9.olb
    PowerPoint 2000 | msppt9.olb
    Access 2000 | msacc9.olb
    | Outlook 2000 msoutl9.olb
    | Word 2002 msword.olb
    | Excel 2002
    excel.exe | PowerPoint 2002 msppt.olb
    Access 2002 | msacc.olb
    | Outlook 2002 msoutl.olb

     

  1. Mon code d’automatisation fonctionnait avec Excel 95, mais échoue avec Excel 97. Que se passe-t-il?

    Le modèle objet pour Excel a apporté une modification significative de la version 95 à la version 97. Excel 95 a implémenté toutes ses méthodes et propriétés dans une implémentation unique d’IDispatch. Cela signifie que souvent, vous pouvez appeler des méthodes destinées à l’objet X, à partir de l’objet Y. Ce n’était pas une bonne conception, donc dans Office 97, chaque objet a sa propre implémentation Idispatch distincte. Cela signifie que si vous demandez une méthode ou une propriété à partir de l’objet X à partir d’un objet Y distinct, vous obtenez l’erreur 0x80020003, -2147352573, « Membre introuvable ». Pour éviter cette erreur, vous devez vous assurer que l’interface IDispatch sous-jacente à partir de laquelle vous effectuez des appels est sémantiquement correcte.
     

  2. L’application que j’automatise reste en mémoire une fois mon programme terminé. Que se passe-t-il?

    Cela est probablement dû au fait que vous avez oublié de publier une interface acquise et que vous devrez la retrouver. Voici quelques suggestions générales et éléments à rechercher :
     

    • Si vous utilisez #import, il est très probable que vous rencontrez l’un des bogues de comptage des références qui lui sont associés. Souvent, les bogues peuvent être résolus, mais il est généralement préférable d’utiliser l’une des autres méthodes Automation. #import ne fonctionne pas très bien avec les applications Office, car ses bibliothèques de types et son utilisation sont assez complexes. En outre, ces problèmes de comptage de références sont difficiles à trouver, car la plupart des appels COM au niveau de l’interface sont en arrière-plan lors de l’utilisation de #import.

    • Vérifiez si vous appelez des méthodes, telles que Open ou New, qui retournent un IDispatch * (LPDISPATCH) et ignorez la valeur de retour. Si c’est le cas, vous abandonnez cette interface retournée et vous devrez modifier votre code afin de le libérer quand vous n’en avez plus besoin.

    • Commentez progressivement des sections de votre code jusqu’à ce que le problème disparaisse, puis rajoutez-le judicieusement pour rechercher où le problème commence.

    • Notez que certaines applications restent en cours d’exécution si l’utilisateur a « touché » l’application. Si cela se produit pendant l’automatisation, l’application restera probablement en cours d’exécution par la suite. Les applications Office ont une propriété « UserControl » sur l’objet Application que vous pouvez lire/écrire pour modifier ce comportement.

    • En outre, certaines applications décident de rester en cours d’exécution si une « action » d’interface utilisateur suffisante s’est produite. Si vous souhaitez que l’application se termine, appelez sa méthode Quit() sur l’objet Application. Word s’arrête quel que soit son nombre de références lors de l’appel de Quit. Il ne s’agit pas d’un comportement COM attendu. Toutefois, Excel se masque correctement, mais reste en cours d’exécution jusqu’à ce que toutes les interfaces en attente soient publiées. En règle générale, vous devez libérer toutes les références en attente et appeler Uniquement Quit() si vous souhaitez que l’application se ferme.

  3. Je sais ce que je veux faire en tant qu’utilisateur d’application Office, mais comment faire cela par programmation via Automation ?

    Ce qui vous intéresse, c’est les objets, les méthodes et les propriétés que vous devez utiliser. La meilleure façon d’apprendre à naviguer dans les modèles objet de Word, Excel et Powerpoint, en fonction de ce que vous souhaitez faire en tant qu’utilisateur, consiste à utiliser l’enregistreur de macros. Il vous suffit de choisir Macro«Enregistrer une nouvelle macro » dans le menu Outils, d’exécuter la tâche qui vous intéresse, puis de choisir Macro\'Arrêter l’enregistrement.' Une fois l’enregistrement terminé, choisissez Macro\Macros dans le menu Outils, sélectionnez la macro que vous avez enregistrée, puis cliquez sur Modifier. Vous accédez ainsi au code VBA généré qui accomplira la tâche que vous avez enregistrée. Gardez à l’esprit que la macro enregistrée ne sera pas le meilleur code possible dans la plupart des cas, mais elle fonctionne très bien pour un exemple rapide.

  4. Puis-je automatiser une application Office incorporée ?

    Absolument. L’astuce consiste à obtenir le pointeur IDispatch : il est indiqué dans la Note technique 39 de Visual C++ (TN039).
     

  5. Comment faire accéder aux propriétés de mon document dans un document Office ?

    Les propriétés du document sont accessibles via Automation ou directement via IPropertyStorage.
     

Besoin d’aide ?

Vous voulez plus d’options ?

Explorez les avantages de l’abonnement, parcourez les cours de formation, découvrez comment sécuriser votre appareil, etc.

Les communautés vous permettent de poser des questions et d'y répondre, de donner vos commentaires et de bénéficier de l'avis d'experts aux connaissances approfondies.

Ces informations vous ont-elles été utiles ?

Dans quelle mesure êtes-vous satisfait(e) de la qualité de la langue ?
Qu’est-ce qui a affecté votre expérience ?
En cliquant sur Envoyer, vos commentaires seront utilisés pour améliorer les produits et services de Microsoft. Votre administrateur informatique sera en mesure de collecter ces données. Déclaration de confidentialité.

Nous vous remercions de vos commentaires.

×