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


Résumé


Cet article répond aux questions les plus fréquentes concernant l’automatisation de Microsoft Office à partir de Visual C++.

Informations supplémentaires


Table des matières

  1. Qu'est-ce-que Automation ?
  2. Je ne connais pas 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 j"automatise reste-t-elle en mémoire après que mon programme est terminé?
  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 ne connais pas 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 rechercher des 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 et 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 procédure : 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 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 :
          // 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 HOWTO : capturer 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 HOWTO : utiliser MFC pour automatiser Excel et remplir une plage avec un tableau
    186122 HOWTO : utiliser MFC pour automatiser Excel et obtenir un tableau d’une plage
    179706 HOWTO : 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 Infos : traduction des erreurs Automation pour VB/VBA
    122957 exemple : outils de décodage de Code erreur OLE de Decode16 et de Decode32
    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 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 problème 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 bien avec les applications Office, car ses bibliothèques de types et d’utilisation sont relativement complexes. En outre, ces problèmes de comptage de référence sont difficiles à repérer parce qu’un grand nombre d’appels au niveau de l’interface COM sont effectuées en arrière-plan 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 valeur de retour. Si vous êtes, vous sont abandonner cette interface retournée et devrez modifier votre code afin que vous libérez lorsque vous n’en avez plus besoin.
    • Progressivement mettre en commentaire des sections de votre code jusqu'à ce que le problème disparaît, puis ajoutez-le précédent judicieusement pour repérer où le problème se manifeste.
    • 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. Les applications Office ont une propriété « UserControl » sur l’objet de l’Application que vous pouvez en lecture-écriture pour modifier ce comportement.
    • En outre, certaines applications décidera de rester en cours d’exécution si suffisamment interface utilisateur « action » s’est produite. Si vous prévoyez la fermeture de l’application, puis appelez sa méthode Quit() sur l’objet Application. Word va arrêter, quel que soit son décompte de références lorsque Quit est appelée. Ce n’est pas le comportement attendu de COM. Excel, toutefois, est correctement simplement masquer lui-même mais restent actives jusqu'à ce que toutes les interfaces en attente sont libérés. En général, vous devez libérer toutes les références en suspens et uniquement appeler 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 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 faire : utiliser l’Automation pour récupérer les propriétés de Document intégrées
    186898 HOWTO : lire les propriétés de Document composé directement avec VC ++