IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

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

SommaireAutomation (14)
précédent sommaire suivant
 

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.

Mis à jour le 5 avril 2013 farscape

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).

Mis à jour le 5 avril 2013 farscape

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).

Mis à jour le 5 avril 2013 farscape

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)

Mis à jour le 5 avril 2013 farscape

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).

Mis à jour le 5 avril 2013 farscape

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)

Mis à jour le 5 avril 2013 farscape

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)

Mis à jour le 5 avril 2013 farscape

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

Mis à jour le 5 avril 2013 farscape

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)

Mis à jour le 5 avril 2013 farscape

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); 
}
A partir de l'assistant Ajout de classes d'une TypeLib,
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.

Mis à jour le 19 septembre 2005 Gabrielly

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2022 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.