none
Ouvrir un document word RRS feed

  • Question

  • Je suis sur l'open de Word. J'ai déclaré une classe managée pour faire ce pas.

    J'ai déclaré des objets de la classe _Application à partir de la classe Application et de la classe Document et je les reçoit par paramètres

    Les objets sont déclarés et crées dans la classe utilisatrice comme suit:

       Word::_Application^                      objApplication;
       Word::Document^                          objDocument;
    
              ....
    	  objApplication = gcnew Word::Application;
    	  objDocument = gcnew Word::Document;

    plus loin ils sont transmis en paramètre pour l'open:

                            else
                            { //7
    							// on ouvre le document
    							// erc OpenDocument(std::wstring wsFullPathName, Word::_Application^ objApplication, Word::Document^ objDocument)
    							objDocumentManager.OpenDocument( wsFullPathName, objApplication, objDocument);
                            }

    et on arrive dans l'Open, qui est construit à partir des documents pour l'event et pour l'open:         

       erc CWManager::OpenDoc(std::wstring wsFullPathName, Word::_Application^ objApplication, Word::Document^ objDocument)
       {
    	   enum OpenDocumentErrors
    	   {
                  CANT_OPEN_DOCUMENT = 1,
                };
    	   bool m_bDocumentIsOpen;
    	   erc ErrorCode = INIT_NO_ERROR;
    	   System::String^ NomDocument;
               int m_pAllWords;
    	   int m_lNumberOfWords;
    	   
           try
           {
    		  Word::_Font^ objFont;
              Word::_ParagraphFormat^ objParagraph;
              Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
               Word::DocumentEvents2_OpenEventHandler^ objHandler;
              bool^ bTrue = true;
              bool^ bFalse = false;
               Object^ oNull = (Object^)0;
               objWord->ApplicationEvents2_DocumentOpenEventHandler( (Word::Document^)objDocument);
              objHandler = objDocument->Open( &wsFullPathName, &bFalse, &bTrue, &bFalse, &oNull, &oNull, &oNull, &oNull, &oNull, &oNull, &oNull, &bTrue, &oNull, &oNull, &oNull);
              objDocument->Activate();
              objApplication->Activate();


    et j'arrive à ces deux messages d'erreur qui correspondent aux deux lignes d'open:

    1>  WordManager.cpp
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(62): error C2273: 'cast de style fonction' : non conforme à droite de l'opérateur '->'
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(63): error C3728: 'event Microsoft::Office::Interop::Word::DocumentEvents2_OpenEventHandler ^Microsoft::Office::Interop::Word::DocumentEvents2_Event::Open' : l'événement ne possède pas de méthode raise

    J'ai bien essayé de rajouter une initialisation de objWord;

    objWord = gcnew Word::ApplicationEvents2_DocumentOpenEventHandler();

    et le compilateur me répond:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(62): error C3350: 'Microsoft::Office::Interop::Word::ApplicationEvents2_DocumentOpenEventHandler' : un constructeur délégué attend 2 argument(s)

    Je vois bien que c'est un constructeur délégué, mais j'ai essayé au petit bonheur la chance de mettre un deuxième paramètre. J'ai donc besoin d'explication sur les constructeurs délégué. J'ai trouvé ça sur msdn? Quand on aura réussi à ouvrir un document Word on aura fait la moitié du chemin


    Jean Noël Martin




    lundi 13 août 2012 07:36

Toutes les réponses

  • "Je vois bien que c'est un constructeur délégué"

    Bin moi, non. :/

    Je pense plus à une traduction malheureuse.

    Moi, je pencherais pour un constructeur de Delegate.

    Le tutoriel suivant vous expliquera ce qu'est un Delegate (en gros, un pointeur de fonction moderne)

    http://www.functionx.com/cppcli/classes/Lesson15c.htm


    Paul Bacelar, Ex - MVP VC++

    vendredi 24 août 2012 13:51
    Modérateur
  • le message indique qu'un constructeur délégué demande deux paramètre et je ne sais pas comment mettre ces deux paramètres

    Jean Noël Martin

    vendredi 24 août 2012 19:30
  • Lisez le tutoriel donné en lien.

    Les paramètres sont l'objet de la méthode, si méthode non statique, et la méthode à appeler.


    Paul Bacelar, Ex - MVP VC++

    lundi 27 août 2012 08:53
    Modérateur
  • Du tutoriel je conclus que je dois dire

    objWord->ApplicationEvents2_DocumentOpenEventHandler( objDocument, &Word::Document::Open( &NomDocument, &bFalse, &bTrue, &bFalse, &oNull, &oNull, &oNull, &oNull, &oNull, &oNull, &oNull, &bTrue, &oNull, &oNull, &oNull));

    mais la syntaxe n'est pas bonne.

    J'ai donc travaillé sur la syntaxe: et j'ai amélioré l'écriture mais je butte sur deux sujets:

    la conversion des variables en objets;

    La syntaxe elle même:

    Je donne l'implémentation retravaillée et les messages d'erreurs

                      Object^ oTrue;
    		  Object^ oFalse;
    		  Object^ oNull;
    		  Object^ oDocument;
    		  Word::_Font^ objFont;
    		  Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    		  NomDocument = gcnew String( wsFullPathName.c_str());
    		  oDocument = gcnew Object( NomDocument);
    		  // Microsoft.XNA.Framework.MediaLibrary* pSong = new Microsoft.XNA.Framework.MediaLibrary();
    		  //Song* pSong = new Song( );
    		  bool^ bTrue = true;
    		  bool^ bFalse = false;
    		  oTrue = gcnew Object( bTrue);
    		  oFalse = gcnew Object( bFalse);
    		  oNull = (Object^)0;
    		  //                         1                  2                            3                  4                          5                          6                          7                8                               9                               10               11                 12                13                      14                          15                         16   
    		  // public: Document^ Open( &Object^ FileName, &Object^ ConfirmConversions, &Object^ ReadOnly, &Object^ AddToRecentFiles, &Object^ PasswordDocument, &Object^ PasswordTemplate, &Object^ Revert, &Object^ WritePasswordDocument, &Object^ WritePasswordTemplate, &Object^ Format, &Object^ Encoding, &Object^ Visible, &Object^ OpenAndRepair, &Object^ DocumentDirection, &Object^ NoEncodingDialog, &Object^ XMLTransform);
    		  //                                                                                        &Object^ FileName
    		  //                                                                                                      &Object^ ConfirmConversions
    		  //                                                                                                               &Object^ ReadOnly
    		  //                                                                                                                       &Object^ AddToRecentFiles
    		  //                                                                                                                                &Object^ PasswordDocument
    		  //                                                                                                                                        &Object^ PasswordTemplate
    		  //                                                                                                                                                &Object^ Revert
    		  //                                                                                                                                                        &Object^ WritePasswordDocument
    		  //                                                                                                                                                                &Object^ WritePasswordTemplate
    		  //                                                                                                                                                                        &Object^ Format
    		  //                                                                                                                                                                                &Object^ Encoding
    		  //                                                                                                                                                                                         &Object^ Visible
    		  //                                                                                                                                                                                                &Object^ OpenAndRepair
    		  //                                                                                                                                                                                                        
    		  //                                                                                                                                                                                                         &Object^ DocumentDirection
    		  //                                                                                                                                                                                                                  &Object^ NoEncodingDialog
    		  //                                                                                                                                                                                                                        &Object^ XMLTransform
    		  objWord->ApplicationEvents2_DocumentOpenEventHandler( objDocument, Word::Documents::Open( oDocument, oFalse, oTrue, oFalse, oNull, oNull, oNull, oNull, oNull, oNull, oNull, oTrue, oNull, oNull, oNull, oNull));
    		  objDocument->Activate();
    		  objApplication->Activate();


    les messages d'erreur la 1° erreur est sur la ligne

    oDocument = gcnew Object( NomDocument);
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(75): error C3673: 'System::Object' : la classe n'a pas de constructeur de copie
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(80): error C3673: 'System::Object' : la classe n'a pas de constructeur de copie
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(81): error C3673: 'System::Object' : la classe n'a pas de constructeur de copie
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(102): error C2273: 'cast de style fonction' : non conforme à droite de l'opérateur '->'
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(102): error C2352: 'Microsoft::Office::Interop::Word::Documents::Open' : appel non conforme d'une fonction membre non static
    1>          d:\usr\memoria\dev\aln_kernel\make\specificationloader\debug\microsoft.office.interop.word.dll : voir la déclaration de 'Microsoft::Office::Interop::Word::Documents::Open'

    J'ai réussi a retirer deux erreurs en codant:

                      oTrue = (Object^) true;
    		  oFalse = (Object^) false;

    et la 3° par le même code

                      oDocument = (Object^) NomDocument;
    		  oTrue = (Object^) true;
    		  oFalse = (Object^) false;

    J'ai encore réduit les erreurs. il n'y en a plus qu'une

    Je vais mettre dans l'ordre la déclaration, le code et l'erreur

    Word::Documents^ objDocuments;

    le code:

    objWord->ApplicationEvents2_DocumentOpenEventHandler( (Word::Document^)objDocument, (Word::Documents^)objDocuments->Open( oDocument, oFalse, oTrue, oFalse, oNull, oNull, oNull, oNull, oNull, oNull, oNull, oTrue, oNull, oNull, oNull, oNull));

    et le message d'erreur ( j'ai mis les casts pour être explicite) dans le code

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(100): error C2273: 'cast de style fonction' : non conforme à droite de l'opérateur '->'
    et il me dit que les casts de la fonction ne sont pas bons



    Jean Noël Martin






    • Modifié JeanNoel53 mardi 4 septembre 2012 15:21
    lundi 3 septembre 2012 14:31
  • C'est quoi ce délire avec des Object dans tous les coins ???

    Utilisez le typage fort de .NET, SVP, comme dans votre précédent code.

    En POO (Programmation Orientée Objet), vous n'avez pas à caster dans les classes de bases pour vous en servire, et tous les classes .NET dérivent de la classe Object.

    Si vous avez bien assimilé le concept de "Delegate" (mais j'en suis pas sûr), il vous reste à assimiler le concept d'event .NET (qui encapsule les Events COM des composants Office)

    http://www.functionx.com/vccli/general/events.htm

    Partant de là, le code devrait ressembler à ceci (mais je comprend pas trop la logique de la démarche):

    static void CWManager::OnDocumentOpen(Word::Document^ document)

    {

    ...

    }

    Word::Document^ CWManager::OpenDoc(std::wstring wsFullPathName, Word::_Application^ objApplication) { ...

    Word::Document^ retVal = nullptr

    ... try { Word::_Font^ objFont;

    Word::_ParagraphFormat^ objParagraph;

    Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;

    Word::DocumentEvents2_OpenEventHandler^ objHandler;

    objWord->ApplicationEvents2_DocumentOpenEventHandler += gcnew ApplicationEvents2_DocumentOpenEventHandler( &OnDocumentOpen);

    retVal = objDocument->Open( &wsFullPathName, false, true, false, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, true, nullptr, nullptr, nullptr);

    retVal->Activate();

    objApplication->Activate();

    ...


    Paul Bacelar, Ex - MVP VC++

    mercredi 5 septembre 2012 09:02
    Modérateur
  • bonjour,

    Mon besoin est d'ouvrir un document Word en lecture pour le lire après, paragraphe par paragraphe, et l'ensemble des code que j'ai essayé ou que vous m'avez proposé sortent en erreur avec toujours les même raisons. je cherche encore. Le document au départ est donné par son nom complet qui est une :

    std::wstring wsFullPathName;

    L'open est une petite primitive qui doit se compiler au départ. La lecture est également une petite primitive qui à aussi ses problèmes. quand ces deux primitive marcheront, nous aurons pratiquement résolu le problème. Mais même la syntaxe du passage de paramètres est approximative.

    L'open quand il est seul donne toujours le diagnostique n'est par raise

    et le handler donne toujours le diagnostique cast non accepté sauf si on retire l’évènement, et quand le paramètre est bien passé il donne le diagnostique  un constructeur délégué demande deux paramètres.

    Soit il y a une autre primitive a utiliser dans le panel, et je ne l'ai pas trouvé, soit la syntaxe est à améliorer.

    J'ai donc codé:

    	   Word::Document^ retVal = nullptr;
    	   Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    	try 
    		{
    			objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( OnDocumentOpen( objDocument));
    			retVal = objDocument->Open( &wsFullPathName, false, true, false, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, true, nullptr, nullptr, nullptr, nullptr);
                retVal->Activate(); objApplication->Activate();

    et la méthode OnDocumentOpen comme suit

    void CWManager::OnDocumentOpen(Word::Document^ document)
    {
    
    		   
    }

    et j'ai les messages d'erreurs suivant:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(71): error C3364: 'Microsoft::Office::Interop::Word::ApplicationEvents2_DocumentOpenEventHandler' : argument non valide pour le constructeur délégué ; la cible du délégué doit être un pointeur vers une fonction membre
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(72): error C3728: 'event Microsoft::Office::Interop::Word::DocumentEvents2_OpenEventHandler ^Microsoft::Office::Interop::Word::DocumentEvents2_Event::Open' : l'événement ne possède pas de méthode raise
    1>

    qui sont des représentants des message d'erreurs ci dessus évoqués.

    J'ai également essayé:

    			objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( (CWManager::OnDocumentOpen( objDocument)), (objDocument->Open( &wsFullPathName, false, true, false, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, true, nullptr, nullptr, nullptr, nullptr)));
    

    avec les messages suivants:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(71): error C3728: 'event Microsoft::Office::Interop::Word::DocumentEvents2_OpenEventHandler ^Microsoft::Office::Interop::Word::DocumentEvents2_Event::Open' : l'événement ne possède pas de méthode raise
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(71): error C3350: 'Microsoft::Office::Interop::Word::ApplicationEvents2_DocumentOpenEventHandler' : un constructeur délégué attend 2 argument(s)

    et il n'accepte pas les & devant les nom de fonctions.


    Jean Noël Martin










    • Modifié JeanNoel53 jeudi 6 septembre 2012 16:04
    mercredi 5 septembre 2012 13:22
  • Et finalement la solution était plus simple

    Mais elle demandait que tous les paramètre soient typés en tant qu'objet:

                      Object^ oFalse = false;
    		  Object^ oTrue = true;
    		  Object^ oNull = nullptr;
    		  Object^ NomDocument = gcnew String( wsFullPathName.c_str());
    		  objDocument = objDocuments->Open( NomDocument, oFalse, oTrue, oFalse, oNull, oNull, oNull, oNull, oNull, oNull, oNull, oTrue, oNull, oNull, oNull, oNull);
    		  objDocument->Activate();
    		  objApplication->Activate();

    Il va falloir la vérifier en testant.


    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 vendredi 7 septembre 2012 08:18
    • Non marqué comme réponse JeanNoel53 samedi 22 septembre 2012 12:00
    vendredi 7 septembre 2012 08:18
  • Pour passer pour un rabat-joie, vous êtes complètement perdu.

    Les messages d'erreurs n'ont jamais indiqué que le problème était sur la ligne "objDocument->Open".

    Et vous continuez à considerer que "(&OnDocumentOpen)" (cf. mon code) et "OnDocumentOpen( objDocument)" ou "&OnDocumentOpen( objDocument)" c'est la même chose.

    Mais pourtant, cela n'a strictement rien à voir. C'est à croire que vous ne prenez même pas la peine de lire les pages que je donne en références, exaspérant.


    Paul Bacelar, Ex - MVP VC++


    mercredi 19 septembre 2012 18:08
    Modérateur
  • A l'exécution l'open codé dans mon dernier message part en exception et je ne sais pas quelle est cette exception.

    L'exception est SEHException qui est documenté dans cette page

    Je suppose que ça vient de l'absence de la primitive:

    ApplicationEvents2_DocumentOpenEventHandler

    Je vais essayer de l'implémenter, mais j'ai un mauvais souvenir du précédent essai:

    J'ai codé:

    	   Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    
    	   objWord->ApplicationEvents2_DocumentOpenEventHandler += gcnew ApplicationEvents2_DocumentOpenEventHandler( &OnDocumentOpen( objDocument));

    et j'ai comme messages d'erreur

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2273: 'cast de style fonction' : non conforme à droite de l'opérateur '->' 1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2061: erreur de syntaxe : identificateur 'ApplicationEvents2_DocumentOpenEventHandler'

    Je conclue que objWord n'est pas le bon type?

    J'ai donc relu les document en référence et j'ai conclu qu'il fallait coder:

    objWord += gcnew ApplicationEvents2_DocumentOpenEventHandler( this, &OnDocumentOpen( objDocument));

    ce qui arrange les choses: maintenant on est dans l'EventHandler

    voilà le code d'erreur:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2061: erreur de syntaxe : identificateur 'ApplicationEvents2_DocumentOpenEventHandler'

    j'ai introduit dans l'EventHandler une référence à this. qui doit résoudre l'ancien message d'erreur un constructeur délégué attend deux arguments.

    J'ai essayé de séparer les causes potentielles d'erreur en codant sur trois lignes, et sans surprise ça a étendu les messages d'erreur.

    	   SpecificationLoader::CWManager::OnDocumentOpen^ ptrWord;
    	   ptrWord = &SpecificationLoader::CWManager::OnDocumentOpen( objDocument);
    	   objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( this, ptrWord);

    je ne mets les messages d'erreur que ceux relatifs aux deux premières lignes:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(68): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(68): error C3867: &'SpecificationLoader::CWManager::OnDocumentOpen' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'SpecificationLoader::CWManager::OnDocumentOpen' pour créer un pointeur vers membre
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2102: '&' nécessite une l-value

    J'ai aussi essayer:

       erc CWManager::StartWordApi( Word::Document^ objDocument)
       {
                    Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    		CWManager::OnDocumentOpen^ ptrWord;
    		bonDocumentOpen = false;
    		ptrWord = &CWManager::OnDocumentOpen;
    		objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( this, ptrWord);
    		return(0);
       }

    Ça a fait diminuer un peu les messages d'erreur:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(48): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(48): error C3867: &'SpecificationLoader::CWManager::OnDocumentOpen' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'SpecificationLoader::CWManager::OnDocumentOpen' pour créer un pointeur vers membre
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(50): error C2065: 'ptrWord' : identificateur non déclaré
    Je ne sait pas trop comment déclarer ptrWord? et après comment désigner OnDocumentOpen.

    J'ai cependant avancé sur l'architecture global. J'ai mis l'EventHandler dans la procédure StartWordApi qui est appelé par la procédure StartReader, et j'ai mis dans OnDocumentOpen un booleen qui passe à true quand l'EventHandler s'est terminé. Dans le code appelant, Je met une boucle while qui attend le passage à true du booleen, puis j’effectue l'open du document.

    Je donne d'abord la déclaration du booleen:

            class CWManager
    	{
    	public:
    		static bool CWManager::bonDocumentOpen;
    		CWManager::CWManager();
    		CWManager::~CWManager();

    puis le code de OnDocumentOpen:

       void CWManager::OnDocumentOpen(Word::Document^ document)
       {
    		bonDocumentOpen = true;
       }

    puis le code de l'appelant:

    	  objDocumentManager.StartReader( DocType, objDocument);
    	  while( SpecificationLoader::CWManager::bonDocumentOpen == false);
    	  objParagraphs = objDocument->Paragraphs;
    	  objDocumentManager.OpenDocument( wsFullPathName, objApplication, objDocument, objParagraph);


    Ce code n'a pas révélé de problème jusqu'à présent. il faut traiter les problèmes de WordManager.


    Jean Noël Martin









    • Modifié JeanNoel53 dimanche 23 septembre 2012 16:44
    samedi 22 septembre 2012 12:01
  • Vous cherchez toujours midi à 14 heures.

    A l'exécution l'open codé dans mon dernier message part en exception et je ne sais pas quelle est cette exception.

    L'exception est SEHException qui est documenté dans cette page

    Vous ne savez toujours pas vous servir du débuggeur de VS ?

    Il est à même de vous donnez toutes les informations sur l'exception et sur l'endroit où elle s'est produite. Prenez la peine de lire la documentation des outils que vous utilisez avant de faire des suppositions complètement fausses.

    Je suppose que ça vient de l'absence de la primitive:

    ApplicationEvents2_DocumentOpenEventHandler

    Vous n'avez toujours pas compris que ce n'est qu'un event de notification lors de l'ouverture d'un document par Word et qu'il n'a aucun effet "actif" lors de cette ouverture. Donc laissez cette event en paix.

    Je vais essayer de l'implémenter, mais j'ai un mauvais souvenir du précédent essai:

    J'ai codé:

    	   Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    
    	   objWord->ApplicationEvents2_DocumentOpenEventHandler += gcnew ApplicationEvents2_DocumentOpenEventHandler( &OnDocumentOpen( objDocument));

    et j'ai comme messages d'erreur

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2273: 'cast de style fonction' : non conforme à droite de l'opérateur '->' 1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2061: erreur de syntaxe : identificateur 'ApplicationEvents2_DocumentOpenEventHandler'

    Je conclue que objWord n'est pas le bon type?

    TU M'ETONNES. Vous n'avez rien compris aux références que je vous ai donné. Si vous ne comprenez pas le concept de base, il faut commencer par là.

    Et les handles objets, c'est comme en JAVA, et les pointeurs C++, ça s'initialise avant de s'utiliser.

    J'ai donc relu les document en référence et j'ai conclu qu'il fallait coder:

    objWord += gcnew ApplicationEvents2_DocumentOpenEventHandler( this, &OnDocumentOpen( objDocument));

    Relisez encore. J'ai l'impression que vous foutez de moi, vous faites les mêmes erreurs que les postes antérieurs et que je vous avez signalé dans mon derniers post. C++/CLI est fortement typé, on ne peut pas faire n'importe quoi avec n'importe quel objet. Je pense que vous n'êtes même pas capable de me dire quel est le type de "objWord" et quel type déclare l'event ApplicationEvents2_DocumentOpen et le type delegate ApplicationEvents2_DocumentOpenEventHandler.

    ce qui arrange les choses: maintenant on est dans l'EventHandler

    voilà le code d'erreur:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2061: erreur de syntaxe : identificateur 'ApplicationEvents2_DocumentOpenEventHandler'

    De mieux en mieux. On a un meilleur code parce qu'on à moins d'erreurs signalées. Le genre de réflexion que je n'accepte même pas d'un stagiaire. Vous avez tout simplement oublié le namespace Word, ce qui "cache" les autres colossales erreurs. Lâchez ce putain d'event, vous savez pas vous en servir et vous n'en avez pas besoin.

    j'ai introduit dans l'EventHandler une référence à this. qui doit résoudre l'ancien message d'erreur un constructeur délégué attend deux arguments.

    J'ai essayé de séparer les causes potentielles d'erreur en codant sur trois lignes, et sans surprise ça a étendu les messages d'erreur.

    	   SpecificationLoader::CWManager::OnDocumentOpen^ ptrWord;
    	   ptrWord = &SpecificationLoader::CWManager::OnDocumentOpen( objDocument);
    	   objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( this, ptrWord);

    je ne mets les messages d'erreur que ceux relatifs aux deux premières lignes:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(68): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(68): error C3867: &'SpecificationLoader::CWManager::OnDocumentOpen' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'SpecificationLoader::CWManager::OnDocumentOpen' pour créer un pointeur vers membre
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(69): error C2102: '&' nécessite une l-value

    Re Tu M'ETONNES, elle ressemble à quoi la classe managée "SpecificationLoader::CWManager::OnDocumentOpen" que vous utilisez ? Il y a du progrès, vous initialisez les variables, faudrait juste que les types utilisés existent. (C'est même plus drôle :-( )

    J'ai aussi essayer:

       erc CWManager::StartWordApi( Word::Document^ objDocument)
       {
                    Word::ApplicationEvents2_DocumentOpenEventHandler^ objWord;
    		CWManager::OnDocumentOpen^ ptrWord;
    		bonDocumentOpen = false;
    		ptrWord = &CWManager::OnDocumentOpen;
    		objWord += gcnew Word::ApplicationEvents2_DocumentOpenEventHandler( this, ptrWord);
    		return(0);
       }

    Ça a fait diminuer un peu les messages d'erreur:

    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(48): error C2065: 'ptrWord' : identificateur non déclaré
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(48): error C3867: &'SpecificationLoader::CWManager::OnDocumentOpen' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'SpecificationLoader::CWManager::OnDocumentOpen' pour créer un pointeur vers membre
    1>..\..\..\..\Linguistic\WordReader\src\WordManager.cpp(50): error C2065: 'ptrWord' : identificateur non déclaré
    Je ne sait pas trop comment déclarer ptrWord? et après comment désigner OnDocumentOpen.

    J'ai cependant avancé sur l'architecture global. J'ai mis l'EventHandler dans la procédure StartWordApi qui est appelé par la procédure StartReader, et j'ai mis dans OnDocumentOpen un booleen qui passe à true quand l'EventHandler s'est terminé. Dans le code appelant, Je met une boucle while qui attend le passage à true du booleen, puis j’effectue l'open du document.

    Je donne d'abord la déclaration du booleen:

            class CWManager
    	{
    	public:
    		static bool CWManager::bonDocumentOpen;
    		CWManager::CWManager();
    		CWManager::~CWManager();

    puis le code de OnDocumentOpen:

       void CWManager::OnDocumentOpen(Word::Document^ document)
       {
    		bonDocumentOpen = true;
       }

    puis le code de l'appelant:

    	  objDocumentManager.StartReader( DocType, objDocument);
    	  while( SpecificationLoader::CWManager::bonDocumentOpen == false);
    	  objParagraphs = objDocument->Paragraphs;
    	  objDocumentManager.OpenDocument( wsFullPathName, objApplication, objDocument, objParagraph);


    Ce code n'a pas révélé de problème jusqu'à présent. il faut traiter les problèmes de WordManager.

    Tiens, je suis encore dans la capacité de voir après avoir été éclaboussé qualité de ce code. Attente active, variable globale planquée maladroitement dans un simple champ statique, typage de variable fumeux.

    Dans les références, il y a des exemples tout fait, comment pouvez-vous autan vous fourvoyer ???


    Paul Bacelar, Ex - MVP VC++

    lundi 24 septembre 2012 11:25
    Modérateur
  • Je fais certainement plein d'erreurs. C'est pour cela que je pose des questions. Je ne suis pas capable à vous lire de savoir dans quelle direction aller?

    Jean Noël Martin

    lundi 24 septembre 2012 12:22
  • N'utilisez plus cet event.

    Regardez dans les propriétés de l'exception le motif de l'exception.

    Après, revenez ici avec ces motifs et ne touchez à rien d'autre que vous ne maîtrisez pas.


    Paul Bacelar, Ex - MVP VC++

    lundi 24 septembre 2012 12:59
    Modérateur
  • Je suis de nouveau sur ce sujet. Je ne sais toujours pas lire les propriétés de l'exception et le motif de l'exception.

    et j'ai une nouvelle exception qui vient d'un objet non initialisé. et le compilateur me dit que je ne peut pas initialiser une interface avec gcnew. comment l'initialiser?

    ci joint le code:

    Word::Documents^ objDocuments = gcnew Word::Documents;


    Jean Noël Martin



    lundi 8 octobre 2012 12:56
  • Il faudrait que vous révisiez vos cours de programmation orientée objet. :-(

    Word::Documents^ objDocuments = objApplication->Documents->Open(...


    Paul Bacelar, Ex - MVP VC++

    mardi 9 octobre 2012 11:18
    Modérateur
  • J'ai donc codé

                            Object^ oFalse = false;
    			Object^ oTrue = true;
    			Object^ oNull = nullptr;
    			Object^ NomDocument = gcnew String( wsFullPathName.c_str());
    			objApplication->Documents->Open( NomDocument, oFalse, oTrue, oFalse, oNull, oNull, oNull, oNull, oNull, oNull, oNull, oTrue, oNull, oNull, oNull, oNull);
    			objDocument->Activate();

    et je tombe dans une exception à l’exécution

    		Message	"Le type ne correspond pas. (Exception de HRESULT : 0x80020005 (DISP_E_TYPEMISMATCH))"	System::String^
    		Source	"Microsoft.Office.Interop.Word"	System::String^
    		Stack	"   à Microsoft.Office.Interop.Word.Documents.Open(Object& FileName, Object& ConfirmConversions, Object& ReadOnly, Object& AddToRecentFiles, Object& PasswordDocument, Object& PasswordTemplate, Object& Revert, Object& WritePasswordDocument, Object& WritePasswordTemplate, Object& Format, Object& Encoding, Object& Visible, Object& OpenAndRepair, Object& DocumentDirection, Object& NoEncodingDialog, Object& XMLTransform)
       à SpecificationLoader.CWManager.OpenDoc(CWManager* , basic_string<wchar_t\,std::char_traits<wchar_t>\,std::allocator<wchar_t> >* wsFullPathName, _Application objApplication, Document objDocument, Paragraph objParagraph) dans e:\usr\memoria\dev\linguistic\wordreader\src\wordmanager.cpp:ligne 97"	System::String^
    

    Je ne sais toujours pas comment capter une exception en dehors des bloc try...catch qui m'ont permis d'acquérir les donnée que je fourni.


    Jean Noël Martin

    mardi 9 octobre 2012 11:50
  • et en remplaçant "oNull" par "System::Reflection::Missing::Value" ça donne quoi ?
    http://msdn.microsoft.com/en-us/library/system.reflection.missing.value.aspx

    Vous ne mettez pas de try catch, si vous lancez votre application via le debugger de VS (touche F5), quand le programme se prendra une exception non catché, le debugger prendra la main si vous cliquez sur "Retry" ou "Réessayer".
    C'est quand le débugger a pris la main que vous avez accès aux pseudo-variables.


    Paul Bacelar, Ex - MVP VC++

    mardi 9 octobre 2012 18:13
    Modérateur
  • sur la première question j'ai codé:

    Object^ oNull = System::Reflection::Missing::Value;

    ce qui n'a rien changé.

    Y a t il une différence avec F5 qu'il y ait un bloc try catch ou non: je n'ai jamais vu l'accès aux pseudo-variables

    J'ai essayé de retirer tous les bloc try catch et sur l'erreur j'ai choisi continuer et je n'ai rien eu à accéder!?!

    c'est le dernier point bloquant: je ne sais pas si le type qui est en faute est le nom du document ou l'objet. Mais c'est une erreur COM

    voila ce que j'ai eu:

    Une exception de première chance de type 'System.Runtime.InteropServices.COMException' s'est produite dans SpecificationLoader.exe

    Informations supplémentaires : Le type ne correspond pas. (Exception de HRESULT : 0x80020005 (DISP_E_TYPEMISMATCH))

    et ça ça cause à mon vécu. mais je ne sais pas comment ouvrir un canal COM?


     Jean Noël Martin





    • Modifié JeanNoel53 mercredi 10 octobre 2012 05:51
    mardi 9 octobre 2012 18:48
  • "j'ai choisi continuer et je n'ai rien eu à accéder!?!"

    J'ai dit  "Retry" ou "Réessayer", PAS "Continuer"

    Je pense qu'il ne faut pas passer par une variable temporaire.

    Utilisez "System::Reflection::Missing::Value" directement dans l'appel.

    Ne passez pas par des variables trop faiblement typées.

    Tentez de tester les paramètres un par un si vous n'arrivez pas à utiliser le débugger


    Paul Bacelar, Ex - MVP VC++

    mercredi 10 octobre 2012 08:21
    Modérateur
  • Je n'ai accès que a deux choix: "continuer" ou "arrêter". Je n'ai pas "Réessayer"

    mais ça marche: je met le code  en dessous.

                            Object^ oFalse = false;
    			Object^ oTrue = true;
    			Object^ oNull = System::Reflection::Missing::Value;
    			wsFullPathName = wsDiskOfTheFile + wsFullPathName;
    			Object^ NomDocument = gcnew String( wsFullPathName.c_str());
    			objDocument = objDocuments->Open( NomDocument, oFalse, oTrue, oFalse, oNull, oNull,   oNull,   oNull,   oNull,   oNull,   oNull,   oTrue, oNull,   oNull,   oNull,   oNull);
    			objDocument->Activate();


    Jean Noël Martin


    • Modifié JeanNoel53 mercredi 10 octobre 2012 09:47
    • Marqué comme réponse JeanNoel53 mercredi 10 octobre 2012 09:48
    • Non marqué comme réponse JeanNoel53 mercredi 17 octobre 2012 07:58
    mercredi 10 octobre 2012 09:34
  • Vous avez un message différent car la détection du problème n'est pas dans du code C++, ok, au lieu de "Réessayer", "arrêter" devrait redonner la main au debugger.

    Le problème était juste dans quoi, svp ?


    Paul Bacelar, Ex - MVP VC++

    mercredi 10 octobre 2012 10:10
    Modérateur