Office Automation avec Visual C++


Résumé


Cet article fournit des réponses à des questions fréquentes relatives à l’Automation dans Microsoft Office depuis Visual C++.

Informations supplémentaires


Tables des matières

  1. Qu’est-ce que l’Automation ?
  2. J’ai une nouveauté de l’automatisation, où puis-je trouver des ressources suffisantes pour en savoir plus ?
  3. Est-ce que je peux utiliser l’automatisation de différentes manières ?
  4. Qu’est-ce que COM ?
  5. Comment puis-je attacher l’instance en cours d’exécution d’une application Office ?
  6. Comment passer des paramètres facultatifs ?
  7. Comment puis-je détecter les événements exposés par les applications Office ?
  8. Mon code d’Automation est trop lent. Comment faire pour accélérer les choses ?
  9. Que signifient ces valeurs d’erreur énormes, comme-2147352573 ou 0x80030002,
  10. Qu’est-ce qu’une bibliothèque de types ?
  11. Mon code d’Automation fonctionne avec Microsoft Excel 95, mais il ne fonctionne pas avec Microsoft Excel 97. Intérêt?
  12. Pourquoi l’application est-elle automatisée reste en mémoire après la fin de mon programme ?
  13. Je sais ce que je veux faire en tant qu’utilisateur de l’application Microsoft Office, mais comment procéder par programmation à l’aide de l’automatisation ?
  14. Puis-je automatiser une application Microsoft Office incorporée ?
  15. Comment accéder aux propriétés d’un document dans un document Microsoft Office ?

Questions et réponses

  1. Qu’est-ce que l’Automation ? Automation (auparavant OLE Automation) est une technologie qui vous permet de tirer parti des fonctionnalités d’un programme existant et de l’incorporer dans vos propres applications. Par exemple, vous pouvez utiliser les fonctionnalités de vérification de l’orthographe et de la grammaire dans Microsoft Word dans votre application, sans que Microsoft Word soit visible pour vos utilisateurs. Vous pouvez même utiliser tous les outils Microsoft Excel de graphique, d’impression et d’analyse des données. Cette technologie peut grandement simplifier et accélérer votre développement.
  2. J’ai une nouveauté de l’automatisation, où puis-je trouver des ressources suffisantes pour en savoir plus ? Le chapitre 24 de David Kruglinski est « à l’intérieur de Visual C++ » (ISBN : 1-57231-565-2) fournit une vue d’ensemble générale ainsi que quelques exemples formidables. Par ailleurs, la base de connaissances Microsoft est une bonne source d’informations. Cet article est un bon début et vous pouvez trouver des références plus spécifiques dans l’article suivant de la base de connaissances Microsoft :
    152023 Recherche de ressources pour étudier OLE Automation
    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 nouveau classeur
  3. Est-ce que je peux utiliser l’automatisation de différentes manières ? Il existe trois méthodes de base pour l’utilisation de l’automatisation : MFC, #import et C/C++ :
    • Avec MFC, utilisez Visual C++ ClassWizard pour générer des « classes wrapper » à partir des bibliothèques de types Microsoft Office. Ces classes, ainsi que d’autres classes MFC, telles que COleVariant, COleSafeArray, COleException, simplifient les tâches de l’automatisation. Cette méthode est généralement recommandée par le biais des autres, et la plupart des exemples de la base de connaissances Microsoft utilisent MFC.
    • #import, une nouvelle directive qui était 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 il est souvent déconseillé en raison de problèmes de comptage de références qui se produisent généralement lors de l’utilisation des applications Microsoft Office.
    • L’Automation C/C++ est beaucoup plus difficile, mais il est parfois nécessaire d’éviter une surcharge avec MFC ou des problèmes liés à #import. Fondamentalement, vous travaillez avec des API comme 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 l’Automation et le langage c#, car COM a été conçu en fonction de la classe C++. Pour plus d’informations, reportez-vous à l’article suivant de la base de connaissances Microsoft pour un exemple C :
    181473 PROCÉDURE : utiliser OLE Automation à partir d’une application 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 contenir du code en séparation dans des objets autonomes. Imaginez-le comme une extension du paradigme de programmation orientée objet (OOP), mais qui s’applique aux applications distinctes. Chaque objet expose un ensemble d’interfaces, et toutes les communications à un objet, telles qu’une initialisation, des notifications et un transfert de données, se produisent par le biais de ces interfaces. COM est également un ensemble de services fournis par des bibliothèques de liens dynamiques (dll) installés avec le système d’exploitation. Automation utilise un grand nombre de ces services. Un exemple est le service de « marshaling » qui compresse les appels de l’application cliente aux fonctions membres des interfaces de l’application serveur et transmet celles-ci à l’application serveur par leurs arguments. Il semble que les interfaces du serveur soient exposées dans l’espace mémoire du client, ce qui n’est pas le cas lorsque le client est un fichier. exe qui s’exécute dans son propre espace de processus. Le regroupement renvoie également les valeurs de retour provenant des méthodes du serveur dans les limites du processus et en toute sécurité les mains de l’appel du client. Il existe de nombreux autres services essentiels pour l’automatisation qui sont fournis par les différentes bibliothèques COM. Les sources d’informations relatives à celles-ci incluent « Inside OLE-Second Edition » par Kraig Brockschmidt, ISBN 1-55615-843-2, « Side COM » par Dale Rogerson’s-ISBN 1-57231-349-8 et « référence du programmeur Automation », «ISBN 1-57231-584-9.
  5. Comment puis-je attacher l’instance en cours d’exécution d’une application Office ? Utilisez l’API GetActiveObject (). Les serveurs Automation s’inscrivent dans la table ROT (Running Object Table) par le biais de 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 qui s’exécutent dans l’application Office que vous voulez joindre, vous ne pourrez joindre que la première instance lancée à l’aide de l’API GetActiveObject (). En théorie, vous pouvez itérer sur le ROT pour chaque instance individuelle, mais les applications Office ne s’inscrivent pas si une autre instance se trouve déjà dans la table ROT, car le moniker correspondant est toujours le même (il n’est pas possible de le distinguer). Cela signifie que vous ne pouvez pas attacher une instance à l’exception de la première. Toutefois, étant donné que les applications Office inscrivent également leurs documents dans la table ROT, vous pouvez joindre d’autres instances en itérant le ROT pour trouver un document spécifique, en y joignant l’objet application. Vous trouverez ci-dessous un certain code dans l’article de la base de connaissances Microsoft suivant pour itérer sur le ROT et Rechercher un nom de document :
    190985 PROCÉDURE : obtenir IDispatch d’un document Excel ou Word à partir d’un fichier OCX
    Vous n’avez pas besoin d’effectuer cette opération pour PowerPoint, car il s’agit d’une application à instance unique. vous ne pouvez avoir qu’une seule instance de celle-ci en cours d’exécution.
  6. Comment passer des paramètres facultatifs ? Certaines méthodes comportent des paramètres facultatifs. Dans Visual Basic, vous pouvez les omettre de façon occasionnelle lors de l’appel de la méthode. Toutefois, lorsque vous appelez avec Visual C++, vous devez transmettre une variante spéciale 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 exactement ce que Visual Basic effectue en coulisses.
  7. Comment puis-je détecter les événements exposés par les applications Office ? Fondamentalement, vous implémentez l’interface d’événements que vous voulez intercepter (« sink »), puis vous configurez une connexion de Conseil avec l’application (« source »). L’article suivant fournit des exemples pas à pas pour Microsoft Word :
    183599 PROCÉDURE : intercepter les événements d’application Microsoft Word97 à l’aide de VC + +
    En règle générale, pour configurer la connexion de notification, vous obtenez la fonction IConnectionPointContainer et appeler FindConnectionPoint () du serveur avec l’IID de l’interface d’événement. Ainsi, vous disposez d’une interface IConnectionPoint et vous pouvez appeler Advise () avec une instance de votre interface d’événements. Le serveur fera alors remonter par le biais de cette interface lorsque ces événements se produisent.
  8. Mon code d’Automation est trop lent. Comment faire pour accélérer les choses ? Une cause courante de problèmes de vitesse au niveau de l’automatisation est la lecture et l’écriture de données répétées. C’est classique pour les clients Automation Excel. Toutefois, la plupart des gens n’ont pas connaissance du fait 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 d’exemples d’informations, consultez les articles suivants de la base de connaissances Microsoft :
    186120 PROCÉDURE : utiliser MFC pour automatiser Excel et remplir une plage avec une matrice
    186122 PROCÉDURE : utiliser MFC pour automatiser Excel & obtenir un tableau à partir d’une plage
    179706 PROCÉDURE : utiliser MFC pour automatiser Excel et créer/mettre en forme un nouveau classeur
    Par ailleurs, il est important de noter 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 Automation pour indiquer au serveur d’effectuer le collage. Ou inversement. communiquez le serveur à la copie dans le presse-papiers, puis collez-les dans votre application.
  9. Quelle est la signification de ces valeurs d’erreur énormes, comme-2147352573 ou 0x80030002 ? Ces valeurs sont appelées HRESULTs et sont définies dans Winerror. h. Les nombres sont tellement importants, car le premier bit représente s’il s’agit d’une erreur ou non. Vous pouvez utiliser l’utilitaire ErrLook. exe fourni avec Visual C++ pour traduire ces nombres en descriptions significatives. Si vous souhaitez obtenir une description par programmation des erreurs, vous pouvez utiliser l’API FormatMessage (). Pour plus d’informations et d’exemples sur l’utilisation de la fonction FormatMessage (), consultez les articles suivants de la base de connaissances Microsoft :
    186063 INFORMATIONS : traduction des erreurs Automation pour VB/VBA
    122957 EXEMPLE : Decode32 et Decode16 des outils de décodage de code d’erreur OLE
    Remarque: Si vous utilisez Visual C++ 6,0 et que vous disposez d’une variable qui contient cette valeur dans la fenêtre de débogage, ajoutez « , HR » (sans les guillemets) à celle-ci pour qu’elle soit traduite pour vous par Visual c++.
  10. Qu’est-ce qu’une bibliothèque de types ? Une bibliothèque de types est semblable à 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 la liste des noms de fichier de bibliothèque de 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 fonctionne avec Excel 95, mais il ne fonctionne pas avec Excel 97. Que se passe-t-il? Le modèle objet d’Excel a changé de manière significative entre la version 95 et 97. Excel 95 a implémenté toutes ses méthodes et propriétés dans une implémentation unique de IDispatch. C’est souvent le cas pour appeler des méthodes signifiées pour Object X, à partir de l’objet Y. Ce n’est pas une bonne conception, donc dans Office 97, chaque objet dispose de sa propre implémentation IDispatch séparée. Cela signifie que si vous demandez une méthode ou une propriété à partir de l’objet X d’un objet distinct Y, vous obtenez le message d’erreur 0x80020003,-2147352573, « membre introuvable ». Pour éviter cette erreur, vous devez vous assurer que l’interface IDispatch sous-jacente de vos appels est la sémantique exacte. Pour plus d’informations, consultez les articles suivants de la base de connaissances Microsoft :
    172108 PROCÉDURE : résolution des problèmes « membre introuvable », erreur 0x80020003
  2. L’application que j’automatise reste en mémoire lorsque mon programme est terminé. Que se passe-t-il? C’est probablement parce que vous avez oublié de libérer une interface acquise et que vous devez effectuer le suivi. Voici quelques suggestions générales et des éléments à Rechercher :
    • Si vous utilisez #import, il est très probable que vous puissiez être en cours d’exécution dans l’un des bogues de décompte de références qui lui sont associés. Il est souvent possible d’utiliser les bogues, mais il est généralement préférable d’utiliser une des autres méthodes d’Automation. #import ne fonctionne pas correctement avec les applications Office, car ses bibliothèques de types et leurs utilisation sont assez complexes. Par ailleurs, de nombreux problèmes liés au décompte de références sont difficiles à repérer, car un grand nombre d’appels COM au niveau de l’interface sont en coulisses lors de l’utilisation de #import.
    • Vérifiez si vous appelez des méthodes, telles que Open ou New, qui renvoient une valeur IDispatch * (LPDISPATCH) et ignorez la valeur de retour. Si tel est le cas, vous abandonnez cette interface renvoyée et devez modifier votre code afin de le libérer lorsque vous n’en avez plus besoin.
    • Commentez progressivement les sections de votre code jusqu’à ce que le problème disparaisse, puis rajoutez-le judicieusement pour détecter l’endroit où le problème est lancé.
    • Notez que certaines applications ne s’exécutent pas si l’utilisateur a « touché » l’application. Si cela se produit pendant l’automatisation, l’application sera probablement exécutée par la suite. Les applications Office disposent d’une propriété « UserControl » sur l’objet d’application que vous pouvez lire/écrire pour modifier ce comportement.
    • Par ailleurs, certaines applications décident de continuer à s’exécuter si le nombre d’actions de l’interface utilisateur est suffisant. Si vous avez l’intention de quitter l’application, appelez la méthode Quit () sur l’objet application. Word s’arrêtera quel que soit le nombre de références lorsque la fonction Quit est appelée. Ce comportement COM n’est pas attendu. En revanche, Excel ne s’affichera qu’une seule fois, mais continuera de s’exécuter jusqu’à ce que toutes les interfaces restantes soient divulguées. En règle générale, vous devez libérer toutes les références en attente et n’appeler que Quit () si vous souhaitez que l’application s’arrête.
  3. Je sais ce que je veux faire en tant qu’utilisateur de l’application Office, mais comment procéder par programmation via l’automatisation ? Ce qui vous intéresse, c’est des objets, méthodes et propriétés que vous devez utiliser. La meilleure façon de découvrir comment naviguer dans les modèles d’objet de Word, Excel et PowerPoint, en fonction de ce que vous voulez faire en tant qu’utilisateur, consiste à utiliser l’enregistreur de macro. Il vous suffit de sélectionner macro’enregistrer la nouvelle macro’dans le menu Outils, d’exécuter la tâche qui vous intéresse, puis de sélectionner macro’arrêter l’enregistrement. ' Lorsque vous avez terminé l’enregistrement, sélectionnez Macro\Macros dans le menu Outils, sélectionnez la macro que vous avez enregistrée, puis cliquez sur modifier. Cela vous permet d’atteindre le code VBA généré qui exécutera 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 est très bien adaptée à un exemple rapide.
  4. Puis-je automatiser une application Office incorporée ? Essentielle. L’astuce consiste à obtenir le pointeur IDispatch : il est fourni dans la note technique Visual C++ 39 (TN039). Pour obtenir un exemple étape par étape, consultez l’article suivant de la base de connaissances Microsoft :
    184663 PROCÉDURE : incorporer et automatiser une feuille de calcul Microsoft Excel avec MFC
  5. Comment accéder aux propriétés d’un document dans un document Office ? Les propriétés du document sont accessibles via l’automatisation ou directement via IPropertyStorage. Les Articles de la base de connaissances Microsoft suivants présentent chaque méthode :
    179494 PROCÉDURE : utiliser Automation pour récupérer les propriétés de document intégrées
    186898 PROCÉDURE : lire les propriétés de document composé directement avec les éléments VC + +