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

VBScript Discussion :

récupérer timeout d'un GetObject


Sujet :

VBScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur automation industrielle
    Inscrit en
    février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur automation industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : février 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut récupérer timeout d'un GetObject
    Bonjour,

    Nouveau sur le forum, alors je connais pas encore tous les codes de fonctionnement. Désolé si je fais pas tout juste!

    J'utilise VBScript dans un environnement WinCC (Siemens). L'idée de base est d'ouvrir un fichier excel. 3 cas peuvent se présenter:
    1. le fichier est fermé -> ouvrir le fichier
    2. le fichier est ouvert -> mette le fichier au premier plan
    3. le fichier est planté (ne répond pas) -> tuer le processus excel, puis ouvrir le fichier

    Pour les 2 premiers cas, le code est fait et fonctionne tel quel.
    Par contre, pour le 3ème cas c'est plus compliqué.

    J'aimerais savoir s'il est possible d'avoir un timeout sur une fonction GetObject?

    J'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objExcel = GetObject(, "Excel.Application")
    Si le programme est planté, mon script reste bloqué à cette étape (logique).

    Pour être clair, j'aimerais que si je reste bloqué sur cette commande plus de 5 secondes, je considère que c'est 3ème option et je fais les actions adéquates.

    Un petit éclairage?

    Merci d'avance!

  2. #2
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 229
    Points : 3 327
    Points
    3 327
    Par défaut
    bonjour,

    Si le programme est planté, mon script reste bloqué à cette étape (logique).
    bin, ce n'est pas vraiment évident

    j'avoue d'ailleurs ne pas très bien me représenter ce que signifie "programme planté" sous Excel :
    s'agit-il d'un fichier tellement malformé qu'il réussit à bloquer totalement Excel et à le rendre inutilisable ou
    simplement de feuilles déclenchant des messages d'erreurs du style références circulaires ou autres ?

    parce que d'une façon générale s'il existe bien une instance d'Excel chargée en mémoire dans un process,
    ton code doit nécessairement ramener un objet sans blocage au niveau de l'instruction GetObject
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    juillet 2009
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2009
    Messages : 2 296
    Points : 5 427
    Points
    5 427
    Par défaut
    Il arrive parfois qu'un programme qu'on a essayé de lancer ne se lance pas(visuellement) suite à une erreur quelconque, une instance reste en mémoire. D'autre fois, quand on essaie de fermer le programme, son visuel disparaît de la vue mais une instance du programme reste également en mémoire. C'est peut-être le cas dont il parle.

    @cralain
    Pour le 3ème cas de figure, on peut fermer le programme(toutes ses instances), ici Excel, en utilisant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit   
      Dim NomProg, objProcess, objWMIService, colProcessList, strComputer
     
      strComputer= "."
      NomProg = "Excel.exe"
      Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2")
      Set colProcessList = objWMIService.ExecQuery("SELECT Name FROM Win32_Process WHERE Name = '" & NomProg & "'")
      For Each objProcess in colProcessList
           objProcess.Terminate()
      Next
    Ensuite, on ouvre le fichier voulu par la méthode dont tu parles en 1
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur automation industrielle
    Inscrit en
    février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur automation industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : février 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour!

    Tout d'abord, merci d'avoir pris le temps de me répondre ;-)

    @omen999
    Dans mon cas, il arrive que Le programme ne répond pas.

    @l_autodidacte
    Merci pour ce bout de code. Si je comprends bien, celui-ci me permet de supprimer le process Excel dans le cas où il se trouve encore dans les processus en cours. J'ai juste?

    Mon problème, c'est que dans le cas où, comme cité ci-dessus, le programme ne répond pas, mon script reste bloqué à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objExcel = GetObject(, "Excel.Application")
    Cela ne me retourne pas d'erreur, et du coup j'ai pas la possibilité de faire une action sur l'erreur. Je suis obligé d'aller tuer manuellement le processus Excel qui ne répond pas, et seulement là je peux faire une action sur l'erreur.

    Je sais pas si je suis assez clair dans ce que j'essaie d'expliquer. N'hésitez pas à me demander plus de précisions...

    PS: pour mes tests, j'essaie d'ouvrir un fichier excel qui contient une macro Open qui exécute une boucle infinie afin de représenter le problème que je rencontre épisodiquement avec mon vrai fichier de travail -> Ce programme ne répond pas

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 229
    Points : 3 327
    Points
    3 327
    Par défaut
    Dans mon cas, il arrive que le programme ne répond pas.
    donc il s'agit bien d'un cas où Excel se bloque en raison de conditions particulières propres au fichier chargé

    soit tu utilises la méthode proposée par l_autodidacte qui a l'inconvénient de tuer d'emblée le process Excel même s'il est parfaitement fonctionnel
    soit tu tentes de récupérer l'état du process Excel pour détecter le blocage avant d'appeler GetObject

    l'objet Win32_Process a une propriété séduisante : ExecutionState mais elle n'a toujours pas été implémentée par MS
    tu peux toujours tester un process Excel en cours avec le script ci-dessous qui énumère toutes les propriétés de l'objet Win32_Process
    peut-être que tu constateras qu'une propriété prend une valeur discernable lorsque le process ne répond pas (sans garantie)

    @ l_autodidacte la ligne 7 comporte une erreur car elle renvoie une collection d'objets incomplets
    la bonne syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & NomProg & "'")
    le script :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Option Explicit 
      Dim NomProg, objItem, objWMIService, colProcessList,oExcel
      'Set oExcel= CreateObject("Excel.Application") (neutralisé dans l'exemple)
      NomProg = "Excel.exe"
      Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2")
      Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & NomProg & "'")
      If colProcessList.Count = 0 Then
      	MsgBox "Pas de process Excel"
    	End If
      For Each objItem in colProcessList
        Wscript.Echo "Caption: " & objItem.Caption & vbCrLf &_
        "CreationClassName: " & objItem.CreationClassName & vbCrLf &_
        "CreationDate: " & objItem.CreationDate & vbCrLf &_
        "CSCreationClassName: " & objItem.CSCreationClassName & vbCrLf &_
        "CSName: " & objItem.CSName & vbCrLf &_
        "Description: " & objItem.Description & vbCrLf &_
        "ExecutablePath: " & objItem.ExecutablePath & vbCrLf &_
        "ExecutionState: " & objItem.ExecutionState & vbCrLf &_
        "Handle: " & objItem.Handle & vbCrLf &_
        "HandleCount: " & objItem.HandleCount & vbCrLf &_
        "InstallDate: " & objItem.InstallDate & vbCrLf &_
        "KernelModeTime: " & objItem.KernelModeTime & vbCrLf &_
        "MaximumWorkingSetSize: " & objItem.MaximumWorkingSetSize & vbCrLf &_
        "MinimumWorkingSetSize: " & objItem.MinimumWorkingSetSize & vbCrLf &_
        "Name: " & objItem.Name & vbCrLf &_
        "OSCreationClassName: " & objItem.OSCreationClassName & vbCrLf &_
        "OSName: " & objItem.OSName & vbCrLf &_
        "OtherOperationCount: " & objItem.OtherOperationCount & vbCrLf &_
        "OtherTransferCount: " & objItem.OtherTransferCount & vbCrLf &_
        "PageFaults: " & objItem.PageFaults & vbCrLf &_
        "PageFileUsage: " & objItem.PageFileUsage & vbCrLf &_
        "ParentProcessId: " & objItem.ParentProcessId & vbCrLf &_
        "PeakPageFileUsage: " & objItem.PeakPageFileUsage & vbCrLf &_
        "PeakVirtualSize: " & objItem.PeakVirtualSize & vbCrLf &_
         "PeakWorkingSetSize: " & objItem.PeakWorkingSetSize & vbCrLf &_
         "Priority: " & objItem.Priority & vbCrLf &_
         "PrivatePageCount: " & objItem.PrivatePageCount & vbCrLf &_
         "ProcessId: " & objItem.ProcessId & vbCrLf &_
         "QuotaNonPagedPoolUsage: " & objItem.QuotaNonPagedPoolUsage & vbCrLf &_
         "QuotaPagedPoolUsage: " & objItem.QuotaPagedPoolUsage & vbCrLf &_
         "QuotaPeakNonPagedPoolUsage: " & objItem.QuotaPeakNonPagedPoolUsage & vbCrLf &_
         "QuotaPeakPagedPoolUsage: " & objItem.QuotaPeakPagedPoolUsage & vbCrLf &_
         "ReadOperationCount: " & objItem.ReadOperationCount & vbCrLf &_
         "ReadTransferCount: " & objItem.ReadTransferCount & vbCrLf &_
         "SessionId: " & objItem.SessionId & vbCrLf &_
         "Status: " & objItem.Status & vbCrLf &_
         "TerminationDate: " & objItem.TerminationDate & vbCrLf &_
         "ThreadCount: " & objItem.ThreadCount & vbCrLf &_
         "UserModeTime: " & objItem.UserModeTime & vbCrLf &_
         "VirtualSize: " & objItem.VirtualSize & vbCrLf &_
         "WindowsVersion: " & objItem.WindowsVersion & vbCrLf &_
         "WorkingSetSize: " & objItem.WorkingSetSize & vbCrLf &_
         "WriteOperationCount: " & objItem.WriteOperationCount & vbCrLf &_
         "WriteTransferCount: " & objItem.WriteTransferCount
      Next
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur automation industrielle
    Inscrit en
    février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur automation industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : février 2020
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse.

    effectivement, la solution proposée par l_autodidacte n'est pas très adaptée à ma situation, car si le fichier est ouvert, je ne veux pas le fermer avant de l'ouvrir à nouveau.

    J'ai testé le bout de code est voici la différence entre les 2 résultats. Personnellement, je ne vois pas vraiment d'élément qui pourrait différencier les 2 cas. Je le poste quand même au cas où je serais passé à côté de quelque chose? En vert, quand le fichier peut s'ouvrir correctement, en rouge, quand le programme ne répond pas.
    Nom : Propriétés excel.png
Affichages : 31
Taille : 47,0 Ko

    Effectivement, dommage que l'on puisse pas récupérer l'ExecutionState. Il n'y a pas une autre propriété qui pourrait remplacer celle-là?

    En tout cas, merci pour l'aide!

  7. #7
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    février 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 1 229
    Points : 3 327
    Points
    3 327
    Par défaut
    Il n'y a pas une autre propriété qui pourrait remplacer celle-là?
    strictement équivalente, non

    sinon à ta place, je m'intéresserais de près à 3 propriétés des process

    ThreadCount : le process bloqué semble (je dis bien semble) mobiliser un peu plus de thread que le process fonctionnel, à vérifier

    et surtout QuotaPeakNonPagedPoolUsage et QuotaNonPagedPoolUsage qui décrivent la même notion : celui de l'utilisation de la mémoire non paginée
    le process bloqué utilise une quantité anormale de cette mémoire normalement réservée au kernel, aux drivers et à certains objets du process (IPC notamment)
    ce qui suggère une fuite mémoire cohérente avec le blocage constaté

    cela reste empirique mais il serait peut-être possible de définir une limite au-delà de laquelle on peut raisonnablement spéculer qu'il s'agit d'un process bloqué
    désolé, mais je n'ai pas mieux à te proposer
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 14h20
  2. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 03h35
  3. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 12h28
  4. Réponses: 11
    Dernier message: 23/07/2002, 15h33
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 18h26

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