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

 Delphi Discussion :

ShellExecute() Controler la fin d'exécution.


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut ShellExecute() Controler la fin d'exécution.
    Hello, bonjour à toute l'équipe,

    J'utilise la fonction ShellExecute() pour importer des clés de registre avec le programme rededit de Windows.

    Tout fonctionne parfaitement si je ne fais aucun traitement derriere l'utilisation de la fonction ShellExecute().

    Par contre si je veux exploiter le résultat donné dans un fichier TXT par Regedit, cela ne fonctionne pas.

    Cela vient du fait que l'import n'est pas terminé alors que le programme continue d'exécuter les instructions suivantes

    Si j'exécute par exemple le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShellExecute(...);
    SLEEP(500);
    Cela fonctionne mais pas sur toutes les stations.

    Question : Comment peux-t-on contrôler la fin d'exécution de la fonction ShellExecute().

    Merci pour vos réponses.

    A bientôt...

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Dans ton cas j'utiliserais un CreateProcess avec un WaitForSingleObject, ceci te permet d'attendre la fin de l'exécution.

    Tu as un exemple d'utilisation dans la Comment lancer et contrôler une application extérieure ?

    @+ Claudius

  3. #3
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Hello Cl@udius,

    Merci pour ta réponse, je vais regarder le code.

    A+

  4. #4
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Re,

    Le problème se pose au niveau du passage de paramètres à CreateProcess

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    If CreateProcess(
    Nil, 
    '"Regedit.exe" 
    "/a F:\essai.txt "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Essai""',
    Nil, 
    Nil, 
    False,
    0,
    Nil,
    Nil,
    StartInfo,
    ProcessInfo) Then
    Les paramètres pour l'import de clé de base de registre avec Regedit sont

    Regedit /a F:\essai.txt "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Essai"

    Cette action importe la clé dans le fichier essai.txt

    Je pense qu'il doit y avoir confusion avec les "

    J'ai cherché un peu toutes les possibilités mais j'ai toujours un message d'erreur d'importation.

    Si vous voyez l'astuce, merci de me le signaler

    A bientôt...

  5. #5
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Re,

    Bon j'ai fini par trouver la synthaxe qui va bien il faut saisir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sRegText := '/a F:\essai.txt "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanceurOAD"';
     
    Pchar('Regedit.exe '+ sRegText);
    A+

  6. #6
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut
    Sinon je te propose ce 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    {*------------------------------------------------------------------------------
      Effectuer un ShellExecute et attendre la fin du process lancé
     
      @Param   vHandle     Handle de la fenêtre parent pour toute fenêtre de message
                           que le système pourrait produire pendant l'exécution de
                           cette fonction
     
      @Param   vOperation  Opération à réaliser :
                           - "open"	: La fonction ouvre le fichier spécifié.
                           Le fichier à ouvrir peut être un exécutable, un document
                           ou un répertoire.
                           - "print" : La fonction imprime le fichier spécifié.
                           Le fichier à imprimer doit être un document.
                           Si le fichier à imprimer est un exécutalbe, la fonction
                           ouvre le fichier comme si "open" avait été spécifié.
                           - "explore" : La fonction explore le répertoire spécifié
     
      @Param   vFichier    Fichier à ouvrir ou à imprimer ou répertoire à ouvrir ou
                           explorer. La fonction peut ouvrir un exécutable ou un
                           document ou imprimer un document.
     
      @Param   vParametres Paramètres à  passer à l'application si le fichier
                           spécifié est un exécutable. Si le fichier spécifié est
                           un document, ne rien passer.
     
      @Param   vRepertoire Répertoire d'exécution. S'il n'est pas indiqué le
                           répertoire en cours est utilisé
     
      @Param   vAffichage  Indique comment la fenêtre doit être montrée. Utiliser
                           les variables Delphi :
                           - SW_HIDE,
                           - SW_SHOWNORMAL,
                           - SW_NORMAL,
                           - SW_SHOWMINIMIZED,
                           - SW_SHOWMAXIMIZED,
                           - etc...
     
      @Param   vDuree      Durée d'attente de la fin d'exécution en millisecondes.
                           Si la fin de l'exécution n'est pas terminée dans le temps
                           imparti, la fonction se termine.
                           Pour attendre à l'infini utiliser la variable INFINITE.
      @Param   ExitCode    Le code de retour de l'application qui a été executée
     
      @Return              Renvoi un code d'erreur :
                           - NO_ERROR                L'attente a aboutit
                           - WAIT_FAILED             L'attente n'a pas aboutit
                           - ERROR_FILE_NOT_FOUND	   Le fichier spécifié n'a pas été
                                                     trouvé
                           - ERROR_PATH_NOT_FOUND	   Le chemin spécifié n'a pas été
                                                     trouvé
                           - ERROR_DDE_FAIL	         La transaction DDE a echoué
                           - ERROR_NO_ASSOCIATION	   Il n'y a pas d'application
                                                     associée à l'extension du
                                                     fichier
                           - ERROR_ACCESS_DENIED     Accès refusé
                           - ERROR_DLL_NOT_FOUND     DLL introuvable
                           - ERROR_CANCELLED	       La fonction a demandé à
                                                     l'utilisateur d'indiquer
                                                     l'emplacement de l'application
                                                     mais l'utilisateur a annulé la
                                                     demande
                           - ERROR_NOT_ENOUGH_MEMORY Mémoire insuffisante
                           - ERROR_SHARING_VIOLATION Une violation de partage a été
                                                     rencontrée
     
      @Comment Exemples d'utilisation :
               //Pour une application
               if ShellExecuteAndWait(
                                      Application.Handle,
                                      'open',
                                      'C:\_DELPHI\CODE_TO_DOC\DCTD_cmd.exe',
                                      'VERIF_SRV.xml',
                                      'X:\SIS_BETA\VERIF_SRV\CODE_TO_DOC\',
                                      SW_SHOWNORMAL,
                                      INFINITE,
                                      ExitCode
                                     ) = NO_ERROR then...
     
               //Pour un document
               if ShellExecuteAndWait(
                                      Application.Handle,
                                      'print',
                                      'C:\Mes documents\toto.pdf',
                                      '',
                                      '',
                                      SW_SHOWNORMAL,
                                      INFINITE,
                                      ExitCode
                                     ) = NO_ERROR then...
    -------------------------------------------------------------------------------}
    function ShellExecuteAndWait(
                                 vHandle     : HWND;
                                 vOperation  : string;
                                 vFichier    : string;
                                 vParametres : string;
                                 vRepertoire : string;
                                 vAffichage  : Integer;
                                 vDuree      : DWORD;
                                 var ExitCode    : DWORD
                                ) : Cardinal;
    var
      vSEInfo   : TShellExecuteInfo;
    begin
      //Initialisation de la structure ShellExecuteInfo
      ZeroMemory(@vSEInfo, SizeOf(vSEInfo));
     
      //Remplissage de la structure ShellExecuteInfo
      vSEInfo.cbSize       := SizeOf(vSEInfo);
      vSEInfo.fMask        := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
      vSEInfo.Wnd          := vHandle;
      vSEInfo.lpVerb       := PChar(vOperation);
      vSEInfo.lpFile       := PChar(vFichier);
      vSEInfo.lpParameters := PChar(vParametres);
      vSEInfo.lpDirectory  := PChar(vRepertoire);
      vSEInfo.nShow        := vAffichage;
      ExitCode := 1;
      //Execution
      if ShellExecuteEx(@vSEInfo) then
      begin
        //ShellExecuteEx OK : attendre la fin du process
        Result := WaitForSingleObject(vSEInfo.hProcess, vDuree);
        GetExitCodeProcess(vSEInfo.hProcess, ExitCode);
      end
      else
      begin
        //ShellExecuteEx KO : renvoyer l'erreur
        Result := GetLastError();
      end;
      CloseHandle(vSEInfo.hProcess);
      Result := 0;
    end;
    Sachant que j'ai eu des petits problèmes lors de la compilation de ce code sous vista (J'ai actuellement un post ouvert sur le forum concernant ceci , mais il marche très bien sinon !

  7. #7
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Hello,

    Merci Stanislas pour ce code, cela peut servir.

    Pour l'instant la gestion par le CreateProcess fonctionne parfaitement.

    Merci à tous pour vos interventions.

    A bientôt...

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 31/05/2008, 19h38
  2. controler la fin d'un swf.
    Par dongnold dans le forum Flash
    Réponses: 13
    Dernier message: 22/12/2006, 21h32
  3. Mettre à jour un controle utilisé par un exécutable
    Par Ndugu dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/09/2006, 09h23
  4. Attendre la fin d'exécution d'un page en JS
    Par TekP@f dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/08/2005, 15h15
  5. [MFC] Controler la fin de l'application
    Par gwen1984 dans le forum MFC
    Réponses: 5
    Dernier message: 11/07/2005, 16h20

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