none
Comment savoir si une instance d'application est valide ? RRS feed

  • Question

  • Bonjour,

    En VB.NET j'ai créé une instance de Word de cette façon :

    Private wApp As Word.Application = New Word.Application()
    

    Et je l'ai ouvert avec un document. Ok.

    Par la suite, si Word a été fermé, cette instance n'est plus valide.

    Comment déterminer si l'instance est toujours valide ou non ?

    Merci.


    Alain
    jeudi 2 décembre 2010 23:14

Réponses

  • Bonjour,

    ce n'est surement pas idéal mais vous effectuer un test d'un appel d'une propriété dans un try/catch. Si elle échoue c'est que l'instance n'est plus valide.

    Par exemple :

    Private Function Check() As Boolean
        Try
          Dim b As Boolean = wApp.Visible
          Return True
        Catch ex As Exception
          Return False
        End Try
    End Function
    

    Une autre solution serait de lire la liste des process word juste avant puis juste aprés avoir ouvert l'application afin de conserver le process Id de l'instance courante.

    Dim proBefore As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("WINWORD")
    wApp = New Word.Application()
    Dim proAfter As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("WINWORD")
    
    

    L'id du process de l'application est le résultat de l'intersection entre les 2 tableaux et vous pourriez ensuite vérifier si ce process est toujours présent.

    Cordialement

    • Marqué comme réponse AchLog samedi 4 décembre 2010 08:06
    vendredi 3 décembre 2010 13:50
    Modérateur

Toutes les réponses

  • Bonjour,

    Il me semble :

    wApp.Close()
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 décembre 2010 07:02
  • > Bonjour,
     
    Bonjour,
     
    > Comment déterminer si l'instance est toujours valide ou non ?
     
    Tu peux par exemple t'abonner à l'évènement Quit en déclarant
    Private WithEvents wApp ...
     
    Ayant fait peu d'automation, je n'en connais pas toutes les méthodes de
    programmation mais j'ai beaucoup utilisé le Try Catch.
     --
    Fred
    foleide@free.fr
     
    vendredi 3 décembre 2010 08:01
  • Bonjour et merci pour vos réponses.

    Ehjoe : je pense que votre proposition ne répond pas à la question mais merci quand même d'avoir répondu. Une précision, pour fermer Word c'est wApp.Quit().

    Foleide : Oui, c'est possible de procéder ainsi, mais je pense qu'il doit bien y avoir une autre méthode permettant de vérifier si une instance existe toujours. Merci.

     


    Alain
    vendredi 3 décembre 2010 08:42
  • Bonjour,

    Par la suite, si Word a été fermé, cette instance n'est plus valide.
    De quelle instance parlez vous ? Votre application ou Word ?
    Et qu'appellez vous par invalide ? (Est-ce un message d'erreur ?)

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    vendredi 3 décembre 2010 09:30
    Modérateur
  • Bonjour Alain,

    Désolé, je pensais que tu évoquais la destruction de l'objet ;o)

    Alors je ne sais pas comment attraper le numéro du processus (handle), on peut passer par les API ou tester les processus en cours (j'ai dû faire ça en VB6), mais je crois que tu n'en veux pas.

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 décembre 2010 10:55
  • Bonjour Gilles,

    Dans mon application WinForm en VB.NET je crée une instance de Word avec l'instruction : 

    Private wApp As Word.Application = New Word.Application()

    Word s'ouvre ensuite à l'écran et l'utilisateur peut, éventuellement, le fermer( son instance). Toute référence par l'appli WinForm a la variable wApp produit alors une erreur.

    Je pourrais sans doute, comme le propose Foleide, intercepter et traiter l’évènement Quit de cette instance de Word afin de mémoriser le fait qu'elle a été fermée, c'est à dire qu'elle n'est plus valide (par exemple en affectant wApp=Nothing).

    Ma question : y a-t'il un autre moyen pour mon application WinForm de s'assurer que wApp correspond bien à une instance de Word existante (valide) ?

    Est-ce plus clair ainsi ?

    Merci.



    Alain
    vendredi 3 décembre 2010 13:02
  • Bonjour,

    ce n'est surement pas idéal mais vous effectuer un test d'un appel d'une propriété dans un try/catch. Si elle échoue c'est que l'instance n'est plus valide.

    Par exemple :

    Private Function Check() As Boolean
        Try
          Dim b As Boolean = wApp.Visible
          Return True
        Catch ex As Exception
          Return False
        End Try
    End Function
    

    Une autre solution serait de lire la liste des process word juste avant puis juste aprés avoir ouvert l'application afin de conserver le process Id de l'instance courante.

    Dim proBefore As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("WINWORD")
    wApp = New Word.Application()
    Dim proAfter As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("WINWORD")
    
    

    L'id du process de l'application est le résultat de l'intersection entre les 2 tableaux et vous pourriez ensuite vérifier si ce process est toujours présent.

    Cordialement

    • Marqué comme réponse AchLog samedi 4 décembre 2010 08:06
    vendredi 3 décembre 2010 13:50
    Modérateur
  • Bonjour Nikho,

    Ah oui, l'idée du test d'une propriété est bonne et rapide a exécuter. J'aurais du y penser... Il faut choisir une propriété qui soit éventuellement VRAIE même si Word est iconisé.

    La seconde idée est bonne aussi bien que plus longue à l'exécution.

    C'est quand même dommage qu'il n'y ai pas une fonction système pour répondre à ce test. A moins que...

    Merci beaucoup.

     

     


    Alain
    vendredi 3 décembre 2010 15:29
  • Bonjour,

    effectivement cette fonction semble manquer...en attendant d'autres réponses vous pouvez toujours ajouter votre propre test sous forme d'une méthode d'extension :

    Module WordAppExtensions
    
      <Extension()> _
      Public Function CheckIfValid(ByVal word As Word.Application) As Boolean
        Try
          Dim b As Boolean = word.Visible
          Return True
        Catch ex As Exception
          Return False
        End Try
      End Function
    
    End Module
    

     

    Cordialement

    • Proposé comme réponse EhJoe samedi 4 décembre 2010 01:07
    vendredi 3 décembre 2010 15:46
    Modérateur
  • Bonne idée Nikho. Merci bien.

     


    Alain
    vendredi 3 décembre 2010 18:43