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

C# Discussion :

Dll Microsoft Interop


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut Dll Microsoft Interop
    Bonjour,
    Je rencontre une difficulté dans une application C#.NET.
    J'effectue une boucle sur plusieurs centaines de fichiers .doc.
    Pour chacun, j'essaye de lire un paragraphe précis, puis je renvoie le contenu texte de ce paragraphe.

    Pour cela j'utilise la dll Microsoft.Office.Interop.Word.

    Sur plusieurs centaines de fichiers traités, j'ai rencontré un blocage sur 3 d'entre eux.
    Quand vient leur tour, mon application se bloque, un processus Winword.exe se lance dans le gestionnaire des tâches, et ne s'arrête jamais.
    Toutefois plusieurs dizaines de minutes plus tard (!), la boucle continue enfin, mais un texte null a été renvoyé.

    Il est possible que les fichiers concernés soient "mal formés".
    Toujours est-il que je souhaite catcher l'erreur, et passer au suivant dans ce cas-là.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    programme principal :
     
        .........
        application = new WordUtils ();
        application.CreateApplication ();
        .........
     
    boucle for sur tous les fichiers {
        .........
        objet = application.recupereObjetDoc (fichierWord);
        .........
    }
     
     
        public class WordUtils
        {
            private object missing = System.Reflection.Missing.Value;
            private Microsoft.Office.Interop.Word.Application application;
            private Document document;
            ..........
     
            public void CreateApplication()
            {
                application = new Microsoft.Office.Interop.Word.Application();
                application.Visible = false;
            }
     
            public string recupereObjetDoc (object filePath) {
                try {
                    document = application.Documents.Open (ref filePath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
                    Microsoft.Office.Interop.Word.Paragraph paraNo2 = document.Content.Paragraphs[3];
                    if ((paraNo2.Range.End - paraNo2.Range.Start) > 1) {
                        string result = paraNo2.Range.Text;
                        ((_Document) document).Close (ref missing, ref missing, ref missing);
                        return result;
                    } else {
                        if (document != null)
                            ((_Document) document).Close (ref missing, ref missing, ref missing);
                        return null;
                    }
                } catch (Exception ex) {
                    return null;
                }
            }

    J'imagine que lorsqu'un fichier "mal formé" est rencontré, la fonction essaye de le lire, mais il y a un plantage (ou en tout cas demande énormément de temps), mais aucune exception n'est levée.

    Sauriez-vous comment contourner le problème, et passer au fichier suivant en cas de problème ?

    Merci d'avance,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Déjà je vois un premier problème c'est que tu lis un paragraphe sans savoir si il existe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Microsoft.Office.Interop.Word.Paragraph paraNo2 = document.Content.Paragraphs[3];
    Je vérifierais déjà si il existe avant de le lire.

    Et sinon il doit y avoir une méthode pour vérifier si le fichier est bien un fichier word.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Salut gcorbineau,

    Bonne remarque, mais malheureusement après ajout de ce test le problème est là.
    L'application est figée dès que la ligne suivant est exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document = application.Documents.Open (ref filePath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
    J'ai refait le test sur ma machine où je développe : en fait Word m'ouvre une popup me disant :
    "Cette erreur est fréquemment rencontrée lorsque le fichier que vous tentez d'ouvrir est verrouillé en lecture. Les raisons possibles du verrouillage en lecture sont les suivantes*:
    Un autre utilisateur a ouvert le fichier sur le même ordinateur que le vôtre ou sur un autre.
    Word s'est interrompu à un moment et a laissé un verrou de lecture sur le fichier.
    Une autre application a verrouillé le fichier en mode exclusif ; Word ne peut donc pas ouvrir le fichier.
    Une application personnalisée est en cours d'exécution et a ouvert ce fichier (sur l'ordinateur d'un autre utilisateur peut-être). Elle a peut-être ouvert le fichier selon une procédure incorrecte.
    Pour résoudre ce problème, refermez toutes les applications, redémarrez Word et essayez d'ouvrir le fichier une nouvelle fois. Si l'opération échoue, examinez les propriétés du fichier pour déterminer s'il est déjà ouvert par quelqu'un d'autre. De temps en temps, un processus fantôme (un programme supprimé ou désactivé) peut avoir verrouillé le fichier. La seule façon de corriger l'anomalie est de redémarrer l'ordinateur."
    Quand je clique sur "OK" dans cette popup, j'ai une nouvelle popup avec un explorateur, où je dois sauvegarder le fichier modèle "Normal.dotm".


    Déjà ceci n'est pas normal, mais au moins je ne suis pas bloqué, et le texte du paragraphe 2 de mon fichier est bien récupéré.
    J'imagine qu'en environnement de Production, ça bloque car je ne vois pas la popup Word...

    Sauriez-vous comment éviter de provoquer l'ouverture de cette popup ?
    Merci d'avance.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Après plusieurs jours de blocage sur une machine de Test, ma boucle fonctionne à nouveau sur TOUS les fichiers.
    Je n'ai rien changé...
    Par contre ça plante toujours sur le serveur de Production.
    Il me semble qu'au final, un fichier Word temporaire invisible empêchait l'ouverture du fichier original, ce qui bloquait la machine... mais c'est à creuser.
    En tout cas je clos la discussion, merci encore gcorbineau.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Re-bonjour,

    J'ai clos mon sujet un peu tôt...

    J'ai toujours un problème quand j'utilise la dll Microsoft.Office.Interop.Word.
    Sur le Document.Open, j'ai au moins compris que si :

    - Word est ouvert (même sans document ouvert)
    - ou si mon document est ouvert
    - ou si la dernière ouverture a conduit à un problème avec Word

    alors une popup Word s'ouvre : j'ai eu le souci avec les 3 popup suivantes :

    • Ce message d'erreur peut s'afficher lorsque vous essayez d'ouvrir un fichier marqué comme endommagé ou désactivé par un programme Microsoft Office System. L'erreur continuera à s'afficher à chaque tentative d'ouverture du fichier (même si celui-ci a été récupéré ou réparé) et les autres fichiers ou programmes actuellement ouverts seront interrompus.
    Le fichier figure dans la liste Éléments désactivés car, lors des précédentes tentatives d'ouverture, il a provoqué la défaillance ou la fermeture du programme à plusieurs reprises.
    ......

    • Des modifications ont été automatiquement enregistrées dans le modèle Normal.doc. Voulez-vous charger la version modifiée ?

    • Fichier utilisé par un autre utilisateur ou une autre application (Normal.dotm)


    Savez-vous comment empêcher Word d'ouvrir de telles popups ?
    En conditions réelles je traite plusieurs centaines de fichiers, et les popup sont invisibles (car Word appelé sur serveur distant), donc l'application reste en attente, et tout se bloque.

    Et moi aussi je bloque là...

    Merci d'avance,

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Ouvre les fichiers en readonly :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object readOnly = true;
    document = application.Documents.Open (ref filePath, ref readOnly , ref missing, ...
    sinon tu peux tester si le fichier est locked avant de l'ouvrir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool isFileLocked=false
    try { File.Open(_fileName, FileMode.Open, FileAccess.ReadWrite, Fileshare.None).Close(); }
    catch (IOException e)
    {
      int errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);    
      isFileLocked=errorCode == 32 || errorCode == 33;
    }
    Mais, c'est pas 100% correct, puisqu'un autre utilisateur peut ouvrir le fichier entre le test de Lock et l'open par WORD.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/06/2011, 10h06
  2. communiquer avec une DLL (COM interop)
    Par aA189 dans le forum EDI/Outils
    Réponses: 0
    Dernier message: 23/04/2010, 20h24
  3. Empêcher une DLL Microsoft de se mettre à jour
    Par nico1492 dans le forum Windows XP
    Réponses: 3
    Dernier message: 25/04/2009, 16h09
  4. Caractères accentués d'une dll microsoft
    Par rpoulin dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 30/04/2008, 16h08
  5. Assembly Microsoft Interop
    Par Nikamura dans le forum C#
    Réponses: 4
    Dernier message: 11/11/2007, 23h11

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