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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Automation Word : GetActiveOleObject vs CreateOleObject


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut Automation Word : GetActiveOleObject vs CreateOleObject
    Bonjour,

    Voilà mon problème, je réalise des fusions/impressions avec Word depuis mon application (langage Delphi7). Pour récupérer l'instance Word j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          try
             MyWordApplication:= GetActiveOLEObject( 'Word.Application' );
             IsNewInstance:= false;
          except
             MyWordApplication:= CreateOleObject( 'Word.Application' );
             IsNewInstance:= true;
          end;

    Hors il semblerait que lors du premier appel à la fusion/impression, souvent je me tape des erreurs du style "'L'objet invoqué s'est déconnecté du client" ou encore "le serveur RPC est indisponible", "L'appel distant a été rejeté", etc... de manière aléatoire. Et souvent il suffit de relancer le processus de fusion/impression pour que ça passe bien...

    En débuggant je n'ai pas l'erreur mais j'ai remarqué que les erreurs ont lieu lorsque je récupère l'instance via "GetActiveOLEObject( 'Word.Application' )" même si je n'en suis pas sûr à 100%. En effet lors du premier appel je passe par 'GetActiveOLEObject' tandis que les fois suivantes je passe par "CreateOleObject( 'Word.Application' )" (assez bizarre finalement on pourrait penser l'inverse).

    Le truc est que je ne vois pas en quoi cela pourrait changer le comportement du serveur automation après coup, et surtout le "rendre instable". En l'occurence sur une machine rapide j'ai plus de chance d'avoir des erreurs de ce type que sur une machine plutôt lente. Quelqu'un a des explications ?

    Merci d'avance.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    juillet 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2002
    Messages : 61
    Points : 63
    Points
    63
    Par défaut
    Bonjour ZZZzzz2,

    Cela parait bizarre en effet, est tu sur qu' après avoir instancier ta variable MyWordApplication , ton code un moment donné ne l'instancie pas une deuxième fois...

    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
        MyWordApplication:= UnAssigned;
        MyWordApplication:= GetActiveOLEObject( 'Word.Application' );
        IsNewInstance:= false;
    except
        MyWordApplication:= CreateOleObject( 'Word.Application' );
        IsNewInstance:= true;
    end;
    Cela pourrait ètre l'explication

    Amicalement Laurent
    C++ BUILDER & DELPHI

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent GAUDILLIER Voir le message
    Bonjour ZZZzzz2,

    Cela parait bizarre en effet, est tu sur qu' après avoir instancier ta variable MyWordApplication , ton code un moment donné ne l'instancie pas une deuxième fois...

    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
        MyWordApplication:= UnAssigned;
        MyWordApplication:= GetActiveOLEObject( 'Word.Application' );
        IsNewInstance:= false;
    except
        MyWordApplication:= CreateOleObject( 'Word.Application' );
        IsNewInstance:= true;
    end;
    Cela pourrait ètre l'explication

    Amicalement Laurent

    Bonjour,

    Merci pour ta réponse, je suis très tardif car provisoirement j'ai simplement remplacé mon code par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       MyWordApplication:= CreateOleObject( 'Word.Application' );
       IsNewInstance:= true;
    Et je créé toujours l'instance, mais je crois me souvenir que j'avais réutilisé l'instance de Word existante pour éviter des problèmes rencontrés sur le fichier 'normal.dot' lorsqu'on utilise Word avec le complément Word de Works...

    Pour info dans ma fonction 'MyWordApplication' est une variable locale initialisée et détruit une fois dans une clause finally :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       MyWordApplication:= CreateOleObject( 'Word.Application' );
       IsNewInstance:= true;
       try
       ...
       finally
          MyWordApplication:= Unassigned;
       end;

    J'avoue ne pas comprendre ce que ta modification peut changer...

Discussions similaires

  1. [Automation Word] Texte en Gras
    Par uskiki85 dans le forum Access
    Réponses: 1
    Dernier message: 07/10/2005, 22h51
  2. [MFC] - Automation Word bug
    Par Alice9 dans le forum MFC
    Réponses: 3
    Dernier message: 25/05/2005, 17h47
  3. [C#] [Automation Word] Récupérer la valeur d'une cellule
    Par Ditch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/06/2004, 16h57
  4. Automation Word
    Par afan dans le forum MFC
    Réponses: 8
    Dernier message: 12/11/2003, 15h50
  5. [AUTOMATION WORD]Pilotage Word par Delphi
    Par Sunny dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 05/12/2002, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo