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

VB 6 et antérieur Discussion :

OpenProcess Lib "kernel32"


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut OpenProcess Lib "kernel32"
    J'utilise ce code pour lancer des batch file sur plusieurs ordinateurs en même temps.

    J'explique un peu comment ça marche: j'ai un formulaire avec 5 boutons, chaque bouton lance la fonction avec comme paramètre le nom de la machine. Si je mets chaque bouton dans une form à part, ça fonctionne parfaitement ! L'ennui vient lorsque tous les boutons sont dans le même formulaire (ce qui est plus logique à faire)

    La fonction LireFichier récupère les fichiers texte qui sont crées sur les machines distantes à la fin de l'exécution de chaque batch et lit le text contenu dans le fichier.

    Le problème est qu'à la fin du premier batch, il y a un debug qui se fait, les autres ne se font tous qu'en même temps à la fin d'exécution du dernier batch
    alors que le besoin de lire le fichier généré juste après la fin de l'exécution du batch en question

    Voici le code et merci de votre aide en avance

    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
    56
    57
    58
    Option Compare Database
    Option Explicit
     
    Rem declaration des api qui permettent d'attendre la fin de l'execution avant de passer a autre chose
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
    Private Const SYNCHRONIZE = &H100000
    Private Const WAIT_TIMEOUT = &H102&
     
    Function Copy_it(machine_name As String) As String
    Dim strmsgbox As String
    Dim Démarre, ProcessHandle, retour
     
     Démarre = Shell("C:\" + machine_name + "_batch.bat", vbNormalFocus)
            ProcessHandle = OpenProcess(SYNCHRONIZE, False, Démarre)
            retour = WaitForSingleObject(ProcessHandle, 1)
     
            Do
            retour = WaitForSingleObject(ProcessHandle, 1)
                DoEvents
            Loop While retour = WAIT_TIMEOUT
     
            retour = CloseHandle(ProcessHandle)
             strmsgbox = LireFichier(machine_name)
          Copy_it = strmsgbox
    Debug.Print Now, machine_name & ": " & Copy_it
     
    End Function
     
     
    Function LireFichier(machine_name As String) As String
        Dim fso     As FileSystemObject
        Dim fFile   As File
        Dim ts      As TextStream
        Dim sPath, result As String
     
        sPath = "\\" & machine_name & "\" & "c$\" & machine_name & "_log.txt"
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        If fso.FileExists(sPath) = False Then
            Exit Function
        End If
     
        Set fFile = fso.GetFile(sPath)
        Set ts = fFile.OpenAsTextStream(ForReading)
     
        result = Trim(ts.ReadAll)
     
        ts.Close
        Set ts = Nothing
        Set fFile = Nothing
        Set fso = Nothing
     
        Debug.Print result
        LireFichier = result
     
    End Function

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    - On ne voit pas par quoi tu appelles copy_it
    - On comprend par ailleurs mal pourquoi des debug.print à plusieurs niveaux (ils suffiraient au niveau de la fonction copy_it pour y voir clair.
    - envoie donc vers une listbox (juste pour y voir plus clair) au lieu de debug.print (juste pour le cas où tu aurais des difficultés à faire "dérouler" ta zone de deboggage...)
    analyse les séquences de la listbox et dis-nous ce que tu y vois, dans l'ordre...

    edit : ou mieux (comme cela tu n'auras plus qu'à faire un copier/coller) :

    ajoute une textbox nommée Voyons avec sa propriété multiline = True
    et remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Now, machine_name & ": " & Copy_it
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Voyons.text = Voyons.txt & vbcrlf &  Now, machine_name & ": " & Copy_it
    et mets-nous ici le copier/coller de cette textbox ...

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 3
    Par défaut
    Bonjour,

    Voici les résultats:
    04/01/2008 10:50:06 Machine1: OK
    04/01/2008 10:50:06 Machine2: OK
    04/01/2008 10:50:06 Machine3: OK
    04/01/2008 10:50:10 Machine4: OK
    04/01/2008 10:50:15 Machine5: OK

    J'ai lancé les .bat à des intervalles différents, malgrè qu'on voit des timestamp différents pour les machine 4 et 5, l'affichage des 5 log s'est fait en même temps

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    L'examen des heures montre bien que le traitement s'est effectué séquentiellement .... tu vois bien !

    Reste que l'affichage lui même peut prendre du temps

    essaye maintenant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Voyons.text = Voyons.txt & vbcrlf &  Now, machine_name & ": " & Copy_it
    doevents
    voyons.refresh

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