FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
- Comment utiliser l'Automation Office dans une application visual C++?
- Comment créer un projet Automation à l'aide des MFC et d'une bibliothèque de types ?
- Comment transmettre un objet COleDispatchDriver comme argument pour une méthode prévoyant un VARIANT ?
- Comment obtenir le handle de fenêtre pour un serveur Office Automation à l'aide des MFC ?
- Comment prendre la main sur une instance d'Office en cours d'exécution?
- Comment passer des paramètres optionnels aux méthodes et aux propriétés ?
- Comment intercepter des événements ?
- Comment améliorer les performances de mon code Automation?
- Comment trouver la signification des erreurs Automation ?
- Pourquoi l'application que j'automatise reste chargée en mémoire même après la fin de mon programme ?
- Comment accéder aux propriétés d'un document Office ?
- Comment transformer un fichier Word en fichier ascii ?
- Où trouver des informations et exemples de code pour Visual C++ ?
- Comment charger Excel à partir d'une application VC++?
Il y a plusieurs manières permettant de prendre le contrôle d'office en utilisant Visual C++ :
Utiliser les MFC et ClassWizard pour générer des classes « wrapper » d'après une librairie de Microsoft office.
Utiliser les « smart pointers » ( "pointeurs intelligents" ) créés avec la directive #import depuis une librairie d'office.
Utiliser le C/C++ pour faire des appels directs aux services COM sans le support des MFC ou de la directive #import.
Pour plus de détails se reporter à la note:
INFO : Utilisation de Visual C++ pour automatiser Office
Exemple sur « codeproject » qui montre comment utiliser office dans une application MFC :
Using MS Office in an MFC Application.
Comment faire pour obtenir le handle de fenêtre pour un serveur Office Automation à l'aide des MFC ?
Pour faire de l'automation sur une instance d'office qui est en cours d'exécution, on doit utiliser l'api GetActiveObject() pour obtenir un pointeur de type IDispatch.
Une fois que l'on dispose du pointeur pour la session office en cours, on pourra appeler toutes ses méthodes et propriétés.
Pour avoir des informations supplémentaires consulter la note :
HOWTO: Attach to a Running Instance of an Office Application (Q238975).
Quand on appelle une méthode qui a des paramètres optionnels depuis Visual C++, il faudra néanmoins fournir une valeur par défaut.
Pour un paramètre de type VARIANT on fournira un variant avec la variable "type" égale à VT_ERROR et "scode " à DISP_E_PARAMNOTFOUND
Pour plus de détails consulter la note :
HOWTO: Passing Optional Parameters When Calling a Function (Q238981).
Les objets Automation peuvent générer des événements comme expliqué dans les notes suivantes :
HOWTO: Catch Microsoft Word97 Application Events Using VC++ (Q183599) et
HOWTO: Catch Microsoft Excel Application Events Using VC++ (Q186427)
Avec l'automation office, on peut recevoir des codes d'erreurs très grands comme -2147352573 .
On peut en retrouver la signification en utilisant l'utilitaire « Error Lookup » fourni avec Visual C++.
On peut aussi utiliser la fonction FormatMessage pour déterminer le message associé au code d'erreur automation.
Ces approches sont décrites dans l'article :
INFO: Translating Large Office Automation Error Values (Q238986).
Si l'application Office qui est automatisée continue de rester en mémoire après que le programme Visual C++ ait fini de s'exécuter, la cause la plus probable et que les interfaces acquises n'ont pas été relâchées.
Pour plus de détails consulter la note :
PRB: Office Application Remains in Memory After Program Finishes (Q238987)
Avec Visual C++ on peut rechercher et manipuler les propriétés intégrées dans les documents produits par Microsoft Word, Excel ou PowerPoint .
Pour plus d'informations et un exemple :
HOWTO: Use Visual C++ to Access DocumentProperties with Automation (Q238393)
Les informations sont aussi accessibles sans automation et donc sans le produit qui a généré le document par l'intermédiaire d'objets COM/OLE : les interfaces IPropertySetStorage et IPropertyStorage.
Pour plus de détails consulter les notes :
HOWTO: Read Compound Document Properties Directly with VC++ (Q186898)
En utilisant l'automation.
Principe : On ouvre le fichier Word par l'automation.
On sauvegarde le fichier au format ASCII (.TXT).
L'exemple ci-dessous suppose que l'on dispose d'un projet généré avec l'option support de l'automation, et que l'on ait inséré les wrappers de classe correspondant aux interfaces COM suivantes :
- _Application
- Documents
- _Document
Pour les installer :
Appeler ClassWizard, puis le bouton add class / from a type library.
Sélectionner le répertoire d'office puis le fichier correspondant à Word avec l'extension .olb
Exemple : MSWORD.OLB
Pour finir sélectionner les interfaces précitées.
L'exemple :
Code C++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // test existance fichier. if(_access(m_FileSrc,0)==-1) { AfxMessageBox("Erreur sur fichier selection"); return; } // TODO: Add extra validation here COleVariant vTrue((short)TRUE),vFalse((short)FALSE), vLong((long)DISP_E_PARAMNOTFOUND, VT_ERROR); _Application appObj; if(!appObj.CreateDispatch("Word.Application")) { AfxMessageBox("Coud Not Create The Application Object"); } appObj.SetVisible(FALSE); Documents docsObj(appObj.GetDocuments()); _Document docObj; docObj.AttachDispatch(docsObj.Open(COleVariant(m_FileSrc),vFalse, vFalse,vFalse,vLong,vLong ,vFalse,vLong,vLong,vLong)); m_FileSrc=m_FileSrc.Left(m_FileSrc.GetLength()-3); m_FileSrc+="txt"; docObj.SaveAs(COleVariant(m_FileSrc),COleVariant((short)2), vFalse,COleVariant(""),vTrue,COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse); appObj.Quit(vLong,vLong,vLong); |
m_FileSrc est une CString contenant le nom du fichier source qui sera transforme en .txt.
L'exemple complet : DocToTxt.zip
Cette section contient des informations et des liens sur des exemples de code pour l'automation office avec les MFC.
Si vous utilisez un de ces exemples avec une version plus récente d'office correspondant à l'exemple,
vous devrez modifier le code pour prendre en compte les nouveaux arguments ou les méthodes qui ont changés.
Pour plus d'informations reportez-vous à la base de connaissances :
Type Libraries for Office May Change with New Release (Q224925)
Concepts généraux:
Create Automation Project Using MFC and a Type Library (Q178749)
Locating Resources to Study Automation (Q152023)
Find the Path and Version of an Office Application from Visual C++ (Q247985)
Use OLE Automation from a C Application Rather Than C++ (Q181473)
Create an Automation Client Project Using ATL (Q196135)
Microsoft Excel Automation
Use MFC to Automate Excel and Create/Format a New Workbook (Q179706)
Embed and Automate a Microsoft Excel Worksheet with MFC (Q184663)
Use MFC to Automate Excel and Fill a Range with an Array (Q186120)
Use MFC to Automate Excel and Obtain an Array from a Range (Q186122)
Automate Excel Using MFC and Worksheet Functions (Q178781)
Use MFC to Copy a DAO Recordset to Excel With Automation (Q243394)
Use MFC to Create a Microsoft Excel Chart (Q178783)
Catch Microsoft Excel Application Events Using VC++ (Q186427)
Automate Excel and Then Know the User Closed It (Q192348)
Use MFC to Automate Excel and Navigate Worksheets (Q178782)
Automate Using VC++ to Save Excel Worksheet as HTML File (Q199691)
Convert Indices (row,col) into Excel-Style A1:C1 Strings (Q198112)
Automate Excel From C++ Without Using MFC or #import (Q216686)
COMEXCEL: Demonstrates an Automation Client Application with Compiler COM Support
Microsoft Word Automation
Automate Microsoft Word to Perform a Mail Merge Using Visual C++ and MFC (Q220911)
Use MFC to Automate Word and Create a Mail Merge for Mailing Labels (Q278260)
Use WordBasic Functions in an MFC Automation Client for Word 97, Word 2000, or Word 2002 (Q252719)
Add Custom Table to the Clipboard to be Pasted into Word (Q216676)
Use Automation to Run a Word Macro with Arguments (Q183369)
Use Automation to Open and Print a Word Document (Q178784)
Catch Microsoft Word 97 Application Events Using VC++ (Q183599)
ActivePrinter Property in Word Sets System Default Printer (Q216026)
Embed and Automate a Word Document with MFC (Q238611)
Visual Basic Equivalents to WordBasic Functions
How to Find the Word Startup-Path Using an External Solution (Q210860)
General Questions and Answers About the Location of Word 2000 Templates (Q210884)
Limited Programmatic Access to Word 2002 Discontiguous Selections (Q288424)
WRD97ERR.DOC Contains a List of Word 97 Automation Errors (Q244491)
Microsoft PowerPoint Automation
Automate PowerPoint Using Visual C++ w/MFC (Q222960)
Use MFC to Create and Show a PowerPoint Presentation (Q180616)
Creating an MFC Automation Controller for PowerPoint (Q169505)
Automate PowerPoint using MFC and Run a Macro (Q237554)
PowerPoint 2000 Event Demonstration Available for Download (Q254009)
Microsoft Outlook Automation
Automate Outlook Using Visual C++/MFC (Q220600)
Send a Message by Outlook Object Model with VC++ (Q199870)
Get the Currently Selected Item in an Outlook Folder from Visual C++ (Q241287)
Questions About Custom Forms and Outlook Solutions (Q146636)
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | void CLoadComponentView::OnExcelcompLoad() { LPDISPATCH pDisp; LPUNKNOWN pUnk; CLSID clsid; BeginWaitCursor(); // Employer Excel.Application.8 pour Office 97 // Employer Excel.Application.9 pour Office 2000 // Employer Excel.Application.10 pour Office XP // Employer Excel.Application.11 pour Office XP 2003 ::CLSIDFromProgID(L"Excel.Application.11", &clsid); if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK) { VERIFY(pUnk->QueryInterface(IID_IDispatch, (void**) &pDisp) == S_OK); m_app.AttachDispatch(pDisp); pUnk->Release(); TRACE("Une instance d'Excel a été trouvé\n"); } else { if(!m_app.CreateDispatch("Excel.Application.11")) { AfxMessageBox("Programme Microsoft Excel non trouvé"); EndWaitCursor(); return; } TRACE("Une instance d'Excel a été crée\n"); } EndWaitCursor(); CWnd* pWnd = CWnd::FindWindow("XLMAIN", NULL); if(pWnd != NULL) { pWnd->ShowWindow(SW_SHOWNORMAL); pWnd->UpdateWindow(); pWnd->BringWindowToTop(); } m_app.put_SheetsInNewWorkbook(1); } |
nous sélectionnons dans la liste une bibliothèques de types disponible comme Microsoft Excel 11.0 Object Library <1.5>
Ensuite dans la listebox de gauche de l'assistant (VC++ .NET), nous choisissons les différentes interfaces qu'Excel dispose comme _Application.
A droite nous avons dans le listbox la classe CApplication qui sera générée à partir de l'interface choisie.
Nous signalons à l'assitant de lire la bibliothèques de types à partir du Registre et nous terminons la procédure de génération d'une classe pilote C++ pour cet objet d'Excel _Application
m_app est objet de type CApplication déclaré dans la vue.
GetActiveObject nous permet de trouver une instance d'Excel déjà en cours d'exécution.
CreateDispatch, par contre crée l'instance et obtient le IDispatch.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.