Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

Automation d'Office à l'aide de Visual C++

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 196776
Résumé
Cet article répond aux questions les plus fréquentes concernant l'Automation de Microsoft Office à partir de Visual C++.
Plus d'informations

Table des matières

  1. Qu'est-ce-que Automation ?
  2. Je suis nouveau sur Automation, où puis-je trouver des bonnes ressources pour en savoir plus ?
  3. Quels sont les différents moyens d'utiliser Automation ?
  4. Nouveautés de COM ?
  5. Comment joindre à l'instance en cours d'exécution d'une application Office ?
  6. Comment transmettre les paramètres facultatifs ?
  7. Comment intercepter les événements exposés par les applications Office ?
  8. Mon code d'automation est trop lent. Comment puis-je accélérer les choses le ?
  9. Que signifient ces valeurs d'erreur énorme, tels que -2147352573 ou 0x80030002 ?
  10. Ce qu'est une bibliothèque de types ?
  11. Mon code d'automation a travaillé avec Microsoft Excel 95, mais échoue avec Microsoft Excel 97. Pourquoi ?
  12. Pourquoi l'application que je suis automatisation ne reste pas en mémoire après la fin de mon programme ?
  13. Je sais ce que je veux faire en tant qu'un utilisateur de l'application Microsoft Office, mais comment effectuer cette opération par programme à l'aide de Automation ?
  14. Est-il possible d'automatiser une application Microsoft Office incorporée ?
  15. Comment accéder à mes propriétés de document dans un document Microsoft Office ?

Questions et réponses

  1. Qu'est-ce-que Automation ?

    Automation (anciennement OLE Automation) est une technologie qui vous permet de tirer parti de la fonctionnalité d'un programme existant et de les incorporer dans vos propres applications. Par exemple, vous pouvez utiliser la fonctionnalité dans votre application sans Microsoft Word visible pour les utilisateurs de vérification de grammaire et Microsoft Word. Vous pouvez même utiliser tous les outils d'analyse de graphiques, l'impression et les données Microsoft Excel. Cette technologie peut considérablement simplifier et accélérer votre développement.
  2. Je suis nouveau sur Automation, où puis-je trouver des bonnes ressources pour en savoir plus ? Le chapitre 24 de "Inside Visual C++" de David Kruglinski (ISBN-57231-565 - 2) fournit une vue d'ensemble, ainsi que quelques bons exemples. En outre, la Base de connaissances Microsoft est une bonne source d'informations. Cet article est un bon point de départ, et vous pouvez trouver des références plus spécifiques dans l'article suivant dans la Base de connaissances Microsoft :
    152023 Localisation de ressources pour l'étude de l'Automation de OLE
    Si vous préférez l'apprentissage par l'exemple, consultez l'article suivant dans la Base de connaissances Microsoft :
    179706 Comment faire pour utiliser MFC pour automatiser Excel & créer/mettre en forme un nouveau classeur
  3. Quels sont les différents moyens d'utiliser Automation ?

    Il existe trois méthodes de base pour utiliser l'automatisation : MFC, #import et C/C++ :

    • Avec MFC, utilisez Visual C++ ClassWizard pour générer des « classes wrapper » à partir de bibliothèques de types de Microsoft Office. Ces classes, ainsi que d'autres classes MFC, telles que COleVariant, COleSafeArray et COleException, simplifient les tâches d'automatisation. Cette méthode est généralement préférée aux autres, et la plupart des exemples de la Base de connaissances Microsoft utilisent MFC.
    • #import, une nouvelle directive qui est devenue disponible avec Visual C++ 5.0, crée VC ++ des « pointeurs intelligents » à partir d'une bibliothèque de types spécifiée. Il est très puissante, mais rarement conseillée en raison de la référence - comptage des problèmes qui se produisent généralement lorsqu'il est utilisé avec les applications Microsoft Office.
    • Automation C/C++ est beaucoup plus difficile, mais parfois nécessaire pour éviter une surcharge avec MFC ou des problèmes avec #import. En fait, vous travaillez avec des API telles que CoCreateInstance(), et interfaces COM telles que IDispatch et IUnknown.
    Il est important de noter qu'il existe de légères différences entre l'Automation à partir de C++ et C brut, car COM a été conçu autour de la classe C++. Pour plus d'informations, consultez l'article suivant dans la Base de connaissances Microsoft pour obtenir un exemple de C :
    181473 Comment faire : Utilisation de OLE Automation à partir d'une Application C
  4. Nouveautés de COM ?

    La technologie Automation est basée sur le modèle COM (Component Object). COM est une architecture logicielle standard basée sur des interfaces et conçue pour que le code en objets autonomes séparées par des. Considérez-le comme une extension du paradigme de programmation orientée objet (OOP), mais applicable à des applications distinctes. Chaque objet expose un ensemble d'interfaces et que toutes les communications vers un objet, comme l'initialisation, des notifications et le transfert de données, par le biais de ces interfaces.

    COM est également un ensemble de services fourni par des bibliothèques de liens dynamiques (DLL) installées avec le système d'exploitation. Automation utilise la plupart de ces services. Par exemple, le service « Triage », qui regroupe les appels de l'application client pour les fonctions membres des interfaces de l'application serveur et transmet les, avec leurs arguments, à l'application serveur. Il donne l'impression que les interfaces du serveur sont exposés dans l'espace mémoire du client, qui n'est pas le cas lorsque le client est en cours d'exécution dans son propre espace de processus .exe. Marshaling permet d'obtenir les valeurs de retour des méthodes du serveur au-delà des limites de processus et en toute sécurité dans les mains de l'appel du client. Il existe de nombreux autres services essentiels à Automation sont fournis par les diverses bibliothèques COM.. Sources d'information comprennent « À l'intérieur de Ole – deuxième édition » par Kraig Brockschmidt, ISBN 1-55615-843-2, « Inside COM » par Dale Rogerson - ISBN 1-57231-349-8 et « Référence du programmeur Automation », ISBN 1-57231-584-9.
  5. Comment joindre à l'instance en cours d'exécution d'une application Office ?

    Utilisez l'API de GetActiveObject(). Serveurs Automation s'enregistrent dans la table ROT (Running Object Table), via l'API RegisterActiveObject(). Automation (clients) peuvent obtenir à l'instance en cours d'exécution avec le 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: Si plusieurs instances sont en cours d'exécution de l'application Office que vous souhaitez joindre, uniquement pouvoir joindre à la première instance qui a été lancée à l'aide de l'API GetActiveObject().

    En théorie, vous pouvez parcourir la table ROT pour chaque instance individuelle, mais les applications Office ne s'inscrire si une autre instance est déjà dans la table ROT car le moniker pour lui-même est toujours le même (il n'a pas pu être unique malgré tout). Cela signifie que vous ne pouvez pas vous joindre à une instance quelconque à l'exception de la première. Cependant, étant donné que les applications Office a également enregistrement leurs documents dans la table ROT, vous pouvez correctement attacher à d'autres instances en itérant au sein de la table ROT à la recherche d'un document, attacher à celui-ci, l'obtention de l'objet Application à partir de celui-ci. Il existe du code dans l'article suivant de la Base de connaissances Microsoft pour une itération de la table ROT et recherchez le nom d'un document :
    190985 Comment faire : Obtenir IDispatch d'un Document Word ou d'Excel à partir d'un OCX
    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 s'exécuter.
  6. Comment transmettre les paramètres facultatifs ?

    Certaines méthodes ont les paramètres « facultatifs ». Dans Visual Basic, vous pouvez par hasard les omettre lors de l'appel de la méthode. Toutefois, lors de l'appel à l'aide de Visual C++ vous devez passer un VARIANT spéciaux dont le champ .vt est VT_ERROR et .scode champ est DISP_E_PARAMNOTFOUND. C'est le cas :
          // 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 intercepter les événements exposés par les applications Office ?

    En fait vous implémentez l'interface d'événement que vous souhaitez intercepter (« récepteur ») et le programme d'installation d'une connexion de notifications de l'application (la « source »). L'article suivant vous donne des exemples pas à pas pour Microsoft Word :
    183599 Procédure : Intercepter des événements d'Application Microsoft Word97 à l'aide de VC ++
    En général, pour configurer la connexion de notifications, vous recevez IConnectionPointContainer du serveur et appelez FindConnectionPoint() avec l'IID de l'interface d'événement. Cela vous donne une interface IConnectionPoint et tout ce qui reste est d'appeler les appeler Advise() pour une instance de l'interface d'événement. Le serveur appelle ensuite revenir par le biais de cette interface lorsque ces événements se produisent.
  8. Mon code d'automation est trop lent. Comment puis-je accélérer les choses le ?

    Une cause courante de problèmes de vitesse avec Automation est avec la lecture et l'écriture de données répétitives. Ceci est généralement utilisé pour les clients Automation d'Excel. Toutefois, la plupart des gens ne connaissent pas encore que ces données peuvent être généralement écrites ou lues en une seule fois à l'aide de SAFEARRAY. Consultez les articles suivants de la Base de connaissances Microsoft pour plus d'informations et des exemples :
    186120 Comment faire : Utiliser MFC pour automatiser Excel et remplir une plage avec un tableau
    186122 Comment faire : Utiliser MFC pour automatiser Excel & obtenir une matrice à partir d'une plage
    179706 Comment faire : Utiliser MFC pour automatiser Excel et créer/mettre en forme un nouveau classeur
    En outre, il est important de souligner que l'en utilisant le Presse-papiers peut parfois améliorer les performances. Par exemple, vous pouvez copier les données dans le Presse-papiers, puis utiliser l'automation pour indiquer au serveur pour coller. Ou vice versa ; informer le serveur à copier dans le Presse-papiers et les coller dans votre application.
  9. En quoi ces valeurs d'erreur énorme, par exemple -2147352573, ou 0x80030002 moyenne ?

    Ces valeurs sont appelées valeurs HRESULT et sont définis dans winerror.h. Les numéros sont très volumineuses, car le premier bit représente si elle est le résultat d'une erreur ou non. Vous pouvez utiliser l'utilitaire ErrLook.Exe qui est fourni avec Visual C++ pour traduire ces numéros des descriptions significatives.

    Si vous souhaitez obtenir par programme une description des erreurs, vous pouvez utiliser l'API FormatMessage(). Consultez les articles suivants de la Base de connaissances Microsoft pour plus d'informations et d'exemples sur l'utilisation de FormatMessage() :
    186063 INFO : Traduction des erreurs Automation pour VB/VBA
    122957 EXEMPLE : Decode32 et Decode16 OLE erreur Code décodeur outils
    REMARQUE: Si vous utilisez Visual C++ 6.0 et que vous avez une variable qui contient cette valeur dans la fenêtre Espion de débogage, ajoutez «, hr "(sans les guillemets) pour qu'il ait Visual C++ traduire pour vous !
  10. Ce qu'est une bibliothèque de types ?

    Une bibliothèque de types est similaire à un fichier d'en-tête C/C++. Il contient les interfaces, les méthodes et les propriétés de la publication d'un serveur. Vous pouvez afficher la bibliothèque de types avec l'Explorateur d'objets OLE/COM (Oleview.exe) fourni avec Visual C++. Voici une liste des noms de fichiers bibliothèque type pour Microsoft Office 95, 97 et 2000 :
           Office Application      | Type library       ------------------------+----------------       Word 95 and prior       | wb70en32.tlb       Excel 95 and prior      | xl5en32.olb       Powerpoint 95 and prior | Powerpoint.tlb       Access 95 and prior     | msaccess.tlb       Binder 95               | binder.tlb       Schedule+               | sp7en32.olb       Project                 | 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       Graph 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'automation a travaillé avec Excel 95, mais échoue avec Excel 97. Que se passe-t-il ?

    Le modèle d'objet pour Excel apporté une modification importante à partir de la version 95 à 97. Excel 95 implémenté toutes les méthodes et les propriétés dans une seule implémentation de IDispatch. Cela signifiait que souvent vous pouvez appeler les méthodes destinées à objet X, à partir de l'objet Y. Ce n'est pas une bonne conception, séparer les dans Office 97, chaque objet possède sa propre implémentation de Idispatch. Cela signifie que si vous demandez une méthode ou une propriété de l'objet X à partir d'un objet distinct Y, vous obtenez l'erreur 0x80020003, -2147352573, « Membre introuvable ». Pour éviter cette erreur, vous devez vous assurer que l'interface IDispatch sous-jacentes, de que vous effectuez des appels à partir est sémantiquement correct. Consultez les articles suivants de la Base de connaissances Microsoft pour plus d'informations :
    172108 Comment faire : Résolution des problèmes de « Membre non trouvé », 0x80020003 erreur
  2. L'application que je suis automatisation reste en mémoire après la fin de mon programme. Que se passe-t-il ?

    Très probablement, c'est parce que vous avez oublié de libérer une interface acquise et vous devrez effectuer son suivi vers le bas. Voici quelques suggestions générales, et éléments de recherche :

    • Si vous utilisez #import, il est très probable que vous pourriez s'exécuter dans un des bogues décompte lui est associés. Souvent les bogues de timesthe peuvent être contournées, mais généralement, il est préférable d'utiliser l'une des autres méthodes d'Automation. #import ne fonctionne pas très wellwith les applications Office, dans la mesure où ses bibliothèques de types et de l'useare assez complexe. En outre, ce problèmes de décompte sont difficiles dépister car beaucoup de la COM au niveau de l'interface appelle arebehind the scenes lors de l'utilisation de #import.
    • Vérifiez si vous appelez des méthodes, telles qu'ouvrir ou nouveau, qui retournent un IDispatch * (LPDISPATCH), sans tenir compte de la propriété returnvalue. Si vous vous trouvez, puis vous sont abandonner cette valeur retournée interfaceand devez modifier votre code afin que vous le relâchez lorsque qui ne sont plus nécessaires.
    • Commentaire des sections de votre code jusqu'à ce que le problemdisappears progressivement, puis l'ajouter retour judicieusement à repérer où commence à theproblem.
    • Notez que certaines applications restera si l'utilisateur a « touché » l'application en cours d'exécution. Si cela se produit alors que vous automatisez, puis l'application probablement reste en cours d'exécution par la suite. TheOffice applications ont une propriété « UserControl » sur le Applicationobject que vous pouvez en lecture-écriture pour modifier ce comportement.
    • En outre, certaines applications décidera de rester en cours d'exécution si enoughuser-interface « action » s'est produite. Si vous avez l'intention de quitter application, puis appelez sa méthode Quit() sur l'Applicationobject. Word va s'arrêter, quel que soit son whenQuit de compteur de référence est appelée. Ce n'est pas le comportement attendu de COM. Excel, toutefois, est correctement tout cacher mais restent actives jusqu'à ce que tous les outstandinginterfaces sont libérées. En général, vous devez libérer les références alloutstanding et appelez uniquement Quit() si vous avez l'intention de l'application à se fermer.
  3. Je sais ce que je veux faire en tant qu'un utilisateur de l'application Office, mais comment effectuer cette opération par programme grâce à l'automatisation ?

    Ce qui vous intéresse, ce sont les objets, les méthodes et les propriétés à utiliser. La meilleure façon d'apprendre à naviguer dans les modèles d'objet de Word, Excel et Powerpoint, en fonction de ce que vous voulez faire en tant qu'utilisateur, est d'utiliser l'enregistreur de macros. Il suffit de choisir Macro\ « Enregistrer une nouvelle Macro » dans le menu Outils, exécution de la tâche qui vous intéresse, puis cliquez sur Macro\ « Arrêter l'enregistrement ». Une fois que vous avez terminé l'enregistrement, choisissez Macro\Macros dans le menu Outils, sélectionnez la macro que vous avez enregistré, puis cliquez sur Modifier. Cela vous prendra au code VBA généré qui accomplira la tâche que vous avez enregistrées. Gardez à l'esprit la macro enregistrée n'est pas le meilleur code possible dans la plupart des cas, mais il est très bien pour obtenir un exemple rapide.
  4. Est-il possible d'automatiser une application Office incorporée ?

    Absolument. L'astuce consiste à obtenir le pointeur IDispatch : cela est donné dans le Visual C++ technique Remarque 39 (TN039). Consultez l'article suivant de la Base de connaissances Microsoft pour obtenir un exemple pas à pas :
    184663 comment Comment faire : Incorporer et automatiser une feuille de calcul Microsoft Excel avec MFC
  5. Comment accéder aux propriétés de Mes documents dans un document Office ?

    Les propriétés du document sont accessibles par le biais de Automation, ou directement via IPropertyStorage. Chaque méthode vous montrer les articles suivants de la Base de connaissances Microsoft :
    179494 Comment faire : Utiliser l'Automation pour récupérer les propriétés de Document intégrées
    186898 Comment faire : Lire les propriétés de Document composé directement avec VC ++
COleDispatchDriver colesafearray colevariant _com_ptr_t _com_variant_t IPropertySetStorage

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 196776 - Dernière mise à jour : 10/11/2015 07:03:00 - Révision : 8.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Project 2000 Standard, Microsoft Excel 2000 Standard, Microsoft Visual C++ 5.0 Édition Entreprise, Microsoft Visual C++ 5.0 Édition Professionnelle, Microsoft Access 97 Standard, Microsoft Excel 97 Standard, Microsoft PowerPoint 97 Standard, Microsoft Outlook 97 Standard, Microsoft Word 97 Standard Edition, Microsoft Access 2000 Standard Edition, Microsoft PowerPoint 2000 Standard, Microsoft Outlook 2000 Standard, Microsoft Word 2000 Standard Edition, Microsoft Access 2002, Microsoft Excel 2002, Microsoft PowerPoint 2002 Standard, Microsoft Word 2002 Standard Edition, Microsoft Outlook 2002 Standard

  • kbsweptvs2008 kbautomation kbmt KB196776 KbMtfr
Commentaires