Office Automation à l'aide de Visual C++

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

Sommaire

Résumé

Cet article répond aux questions courantes concernant les Automation Microsoft Office à partir de Visual C++.

Plus d'informations

Table des matières

  1. Qu'est-ce que l'Automation ?
  2. Je ne connais Automation, où CAN trouve bonnes ressources pour en savoir plus ?
  3. Existe-t-il différents moyens I CAN utiliser Automation ?
  4. Qu'est-ce que COM ?
  5. Comment l'attacher à l'instance en cours d'exécution d'une application Office ?
  6. Transmettre des paramètres facultatifs de ?
  7. Catch d'événements exposés par les applications Office
  8. Mon code d'automation est trop lente. Comment CAN accélérer les choses ?
  9. Que signifient ces valeurs d'erreur énorme, tels que-2147352573 ou 0x80030002 ?
  10. Qu'est-ce qu'une bibliothèque de type ?
  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 reste en mémoire une fois mon programme terminé ?
  13. Je savoir ce que je souhaitez que l'un utilisateur d'application Microsoft Office, mais comment je faire par programme à l'aide d'Automation ?
  14. CAN est-il automatiser une application Microsoft Office incorporée ?
  15. Comment puis-je accéder à Mes propriétés de document dans un document Microsoft Office ?

Questions et réponses :

  1. Qu'est-ce que l'Automation ?

    Automation (anciennement OLE Automation) est une technologie qui 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 dans votre application sans Microsoft Word visible par vos utilisateurs de la vérification grammaticale et orthographique de Microsoft Word. Vous pouvez même utiliser tous les outils d'analyse des graphiques, de l'impression et de données Microsoft Excel. Cette technologie peut considérablement simplifier et accélérer votre développement.
  2. Je ne connais Automation, où CAN trouve bonnes ressources pour en savoir plus ? Chapitre 24 de David Kruglinski «Inside Visual c++» (ISBN:1 - 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 lui-même 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 :
    152023Localisation des ressources dans l'étude de OLE Automation
    Si vous préférez apprentissage par exemple, consultez l'article suivant dans la base de connaissances Microsoft :
    179706Comment faire pour utiliser MFC pour automatiser Excel et créer/mettre en forme un nouveau classeur
  3. Existe-t-il différents moyens I CAN utiliser Automation ?

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

    • Avec MFC, utilisez Visual C++ ClassWizard pour générer des "classes wrapper" dans les bibliothèques de types Microsoft Office. Ces classes, ainsi que d'autres classes MFC, telles que COleVariant, COleSafeArray et COleException, simplifient les tâches d'Automation. Cette méthode est généralement recommandée sur les autres et la plupart des exemples de base de connaissances Microsoft utilisez MFC.
    • # Import, une nouvelle directive est devenue disponible avec Visual C++ 5.0 crée VC ++ «pointeurs intelligents» à partir d'une bibliothèque de type spécifié. Il est très puissante, mais souvent pas recommandée en raison de référence-comptage 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 il est parfois nécessaire pour éviter la surcharge avec MFC ou des problèmes avec # import. En fait, vous travaillez avec ces API 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 :
    181473Comment faire : Utilisation de OLE Automation à partir d'une Application C
  4. Qu'est-ce que COM ?

    La technologie Automation est basée sur COM (Component Object Model). COM est une architecture logicielle standard basée sur des interfaces et conçu pour code séparé en objets autonomes. Considérer 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 à un objet, comme l'initialisation, notifications et transfert de données, par ces interfaces.

    COM est également un ensemble de services fournis par les DLL bibliothèques (DLL) installés avec le système d'exploitation. Automation utilise la plupart de ces services. Par exemple, le service «Triage», qui préparent les appels l'application cliente de fonction membre des interfaces du serveur et le passe ceux, avec leurs arguments, à l'application serveur. Il apparaît que les interfaces du serveur sont exposés dans l'espace de mémoire du client, qui n'est pas le cas lorsque le client est un fichier .exe s'exécutant dans son propre espace de processus. Marshaling également Obtient les valeurs de retour à partir méthodes du serveur arrière au-delà des limites du processus et en toute sécurité dans les mains de l'appel du client. De nombreux autres services sont essentiels à Automation sont fournis par les diverses bibliothèques COM. Sources d'informations sur ceux incluent "Inside OLE - deuxième édition" par Kraig Brockschmidt, ISBN 1-55615-843-2, «Inside COM» par ouvrage de Dale Rogerson - ISBN 1-57231-349-8, et «Automation de référence Guide du programmeur "ISBN 1-57231-584-9.
  5. Comment l'attacher à l'instance en cours d'exécution d'une application Office ?

    Utilisez l'API 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 : s'il existe plusieurs instances en cours d'exécution de l'application Office à joindre, vous serez en mesure de s'attacher à la première instance a été lancée à l'aide de l'API GetActiveObject().

    En théorie, vous pouvez effectuer une itération de la table ROT (Running Object Table) pour chaque instance individuelle, mais les applications Office ne s'enregistrent si une autre instance est déjà dans la table ROT (Running Object Table) parce que le moniker pour elle-même est toujours le même (il n'a pas pu être distingué quand même). Cela signifie que vous ne pouvez pas joindre à une instance à l'exception de la première. Cependant, car les applications Office également enregistrer leurs documents dans la table ROT (Running Object Table), vous pouvez correctement attacher à d'autres instances en effectuant une itération de la table ROT (Running Object Table) recherche d'un document spécifique, attachement à celui-ci, puis en l'objet application à partir de celui-ci. Il existe du code dans l'article suivant de la base de connaissances Microsoft pour itérer la table ROT (Running Object Table) et recherchez le nom de document :
    190985Comment faire : Obtenir IDispatch de Excel ou de Document Word d'un OCX
    Vous n'avez 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 son exécution.
  6. Transmettre des paramètres facultatifs de ?

    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 avec Visual C++ vous devez passer un VARIANT spécial dont le champ .vt est VT_ERROR et champ .scode est DISP_E_PARAMNOTFOUND. Autrement dit :
          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    						
    Ceci est vraiment ce que Visual Basic fait en arrière-plan.
  7. Catch d'événements exposés par les applications Office

    En fait vous implémentez l'interface d'événement à intercepter («récepteur») et configurer une connexion consultative avec l'application (la «source»). L'article suivant vous propose d'exemples pas à pas pour Microsoft Word :
    183599Comment faire : Catch événements d'application Microsoft Word97 à l'aide de VC ++
    En règle générale, pour configurer la connexion de notifications, vous obtenez 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 consiste à appeler Advise() avec une instance de votre interface d'événement. Le serveur puis rappellera via cette interface lorsque ces événements se produisent.
  8. Mon code d'automation est trop lente. Comment CAN accélérer les choses ?

    Une cause courante de problèmes de vitesse avec Automation consiste à utiliser répétitives lecture et écriture de données. Ceci est généralement utilisé pour Excel Automation clients. Toutefois, la plupart des gens ne sont pas savoir que ces données peuvent généralement être écrites ou lus 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 instructifs :
    186120Comment faire : Utiliser MFC pour automatiser Excel et remplir une plage avec un tableau
    186122Comment faire : Utiliser MFC pour automatiser Excel et obtenir un tableau à partir d'une plage
    179706Comment faire : Utiliser MFC pour automatiser Excel et créer/mettre en forme un nouveau 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 pour coller. Ou vice versa ; indiquent au serveur pour la copie vers le Presse-papiers et la coller dans votre application.
  9. Que signifient ces valeurs d'erreur énorme, telles que-2147352573 ou 0x80030002 ?

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

    Si vous souhaitez obtenir par programme une description pour les erreurs, vous pouvez utiliser l'API FormatMessage(). Consultez les articles suivants de la base de connaissances Microsoft pour plus d'informations et des exemples sur l'utilisation de FormatMessage() :
    186063Information : Traduction des erreurs Automation pour VB/VBA
    122957SAMPLE : Outils de décodeur de code d'erreur OLE Decode32 et Decode16
    Remarque : Si vous utilisez Visual C++ 6.0 et avez une variable contenant cette valeur dans la fenêtre Espion de débogage, ajoutez «, hr "(sans les guillemets) lui pour que Visual C++ convertir pour vous !
  10. Qu'est-ce qu'une bibliothèque de type ?

    Une bibliothèque de type est similaire à un fichier d'en-tête C/C++. Il contient des interfaces, des méthodes et des propriétés qui publie un serveur. Vous pouvez afficher la bibliothèque de type avec OLE/COM Object Viewer (Oleview.exe) fourni avec Visual C++. Voici une liste des noms de bibliothèque de type fichier 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 significative de la version 95 à 97. Excel 95 implémenté toutes ses méthodes et 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. Cela n'était pas une bonne conception, afin que dans Office 97, chaque objet ait son propre séparer IDispatch mise en oeuvre. Ceci signifie que si vous demandez une méthode ou une propriété à partir de l'objet X à partir d'un objet distinct Y, vous obtenez l'erreur 0x80020003,-2147352573, "Member introuvable." Pour éviter cette erreur, vous devez vous assurer que l'interface IDispatch sous-jacentes à que qui passent des appels est sémantiquement correct. Consultez les articles suivants de la base de connaissances Microsoft pour plus d'informations :
    172108Comment faire : Dépannage de "Member introuvable", 0x80020003 erreur
  2. L'application que je suis automatisation reste en mémoire une fois mon programme terminé. Que se passe-t-il ?

    Très probablement, cela est dû au fait 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 à ressemble :

    • Si vous utilisez # import, il est très probable que vous pourriez s'exécuter dans une des bogues décompte de référence associées. Souvent les bogues peuvent possible de contourner, mais généralement, il est préférable d'utiliser l'une des autres méthodes Automation. # import n'est pas fonctionnent très bien avec les applications Office, car ses bibliothèques de types et l'utilisation sont assez complexes. En outre, ces problèmes de comptage de référence sont difficiles à dépister étant beaucoup d'appels de COM au niveau de l'interface en arrière-plan lors de l'utilisation de # import.
    • Vérifiez si vous appelez les méthodes, telles qu'ouvrir ou nouveau, qui renvoient 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érer lorsqu'ils ne sont plus nécessaires.
    • Commentez progressivement sections de votre code jusqu'à ce que le problème disparaît, puis ajoutez-le sauvegarder judicieusement pour dépister où commence le problème.
    • Notez que certaines applications reste exécutant si l'utilisateur a «toucher» l'application. Si cela se produit lorsque 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 application qui vous pouvez lecture/écriture pour modifier ce comportement.
    • En outre, certaines applications décidera de rester si suffisamment "action"-interface utilisateur s'est produite. Si vous avez l'intention de la fermeture de l'application, puis d'appeler sa méthode Quit() sur l'objet application. Word s'arrêtera indépendamment de son décompte de références lorsque Quit est appelée. Ce n'est pas le comportement attendu COM. Excel, toutefois, est correctement simplement se cacher mais rester s'exécute tant que toutes les interfaces en attente sont libérés. En règle générale, vous devez libérer toutes les références en suspens et appelez uniquement Quit() si vous avez l'intention de l'application à se fermer.
  3. Je savoir ce que je souhaitez que l'un utilisateur d'application Office, mais comment je faire par programme par l'intermédiaire d'Automation ?

    Ce qui vous intéresse est les objets, les méthodes et les propriétés vous avez besoin d'utiliser. Pour savoir comment naviguer dans les modèles d'objets de Word, Excel et PowerPoint, en fonction de ce que vous voulez faire en tant qu'utilisateur, la meilleure consiste à utiliser l'enregistreur de macro. Juste choisissez Macro\ 'Enregistrer une macro' dans le menu Outils, exécutez la tâche vous intéresse, puis choisissez Macro\ 'Arrêter l'enregistrement'. Une fois que vous avez terminé d'enregistrement, choisissez Macro\Macros dans le menu Outils, sélectionnez la macro que vous avez enregistrées, puis cliquez sur Modifier. Vous accédez alors au code VBA généré qui va accomplir la tâche que vous avez enregistrées. N'oubliez pas la macro enregistrée n'est pas le meilleur code possible dans la plupart des cas, mais il ne très bien pour un exemple rapide.
  4. CAN est-il automatiser une application Office incorporée ?

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

    Les propriétés de document sont accessibles par l'intermédiaire d'Automation, ou directement via IPropertyStorage. Les articles suivants de la base de connaissances Microsoft montrent chaque méthode :
    179494Comment faire : Utiliser Automation pour récupérer les propriétés de document intégrées
    186898Comment faire : Lire des propriétés de document composé directement avec VC ++

Propriétés

Numéro d'article: 196776 - Dernière mise à jour: jeudi 13 mars 2008 - Version: 7.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 Standard
  • Microsoft Excel 2000 Standard
  • Microsoft Visual C++ 4.0 Édition Standard
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • 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
  • Microsoft Word 2000 Standard Edition
  • Microsoft Access 2002
  • Microsoft Excel 2002
  • Microsoft PowerPoint 2002 Standard
  • Microsoft Word 2002 Standard Edition
  • Microsoft Outlook 2002 Standard
Mots-clés : 
kbmt kbsweptvs2008 kbautomation kbfaq KB196776 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: 196776
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