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 :

Un CreateProcess() embêtant


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Un CreateProcess() embêtant
    Bonsoir à tous

    Ce code n'attend pas la fin du processus :

    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
    
    Procedure Pilote_Editer_Listes;
    begin
    
          Form1.JvTrayIcon1.Active := True;
          Form1.JvTrayIcon1.Animated := True;
          Form1.JvTrayIcon1.BalloonHint('LISTER DOSSIERS DE PHOTOS','EDITION DES LISTES', btInfo, 5000, False);
          Form1.JvTrayIcon1.AcceptBalloons.ToString(True);
    
          Form1.JvCreateProcess1.Create(Form1);
          Form1.JvCreateProcess1.StartupInfo.ShowWindow := swNormal;
          Form1.JvCreateProcess1.CommandLine := 'EXPLORER.EXE ' + Nom_Rep_Sortie; // Explorer affiche le répertoire désigné par la variable Nom_Rep_Sortie
          Form1.JvCreateProcess1.WaitForTerminate := True;
    
          Form1.JvCreateProcess1.Run;
    
          Form1.JvTrayIcon1.HideApplication;
          WHile Form1.JvCreateProcess1.State = psWaiting do
              begin
                    Application.ProcessMessages;
              end;
          Form1.JvTrayIcon1.ShowApplication;		// N'attend pas la fin du processus appelé. Parce que c'est Explorer ? 
    
          Form1.JvCreateProcess1.Free;
          Form1.JvTrayIcon1.Active := False;
    
    end;
    A l'exécution, j'ai le message (un peu habituel chez moi) avec un CreateProcess() :



    Ce code, en revanche, fonctionne sans problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          Form1.JvCreateProcess1.CommandLine := 'D:\PROGRAMME.EXE';
          Form1.JvCreateProcess1.WaitForTerminate := True;
          Form1.JvCreateProcess1.Run;
    
          WHile Form1.JvCreateProcess1.State = PsWaiting DO
              begin
                    Application.ProcessMessages;						// Attend bien la fin du processus, MAIS je ne cache pas la fenêtre de l'application
                  
              end;
    
          SetForegroundWindow(Handle_App);
    Ca bogue parce qu'il s'agit d'Explorer, qui ne se ferme jamais (en principe), ou bien parce que je réduis la fenêtre de l'application appelant Explorer ? Celle-ci n'obtempère pas à la minimisation, ni à Form1.Hide . J'ai ce fichu message d'erreur.

    Je pige mal, là ...

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 679
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 679
    Points : 13 082
    Points
    13 082
    Par défaut
    Tu ne peux avoir qu'une seule instance d'explorer.exe. C'est le shell et l'affiche des dossiers n'est qu'une de ses fonctionnalités. Normal qu'un deuxième appel quitte immédiatement.
    Le message est un autre problème. Cela correspond à un SetFocus sur une fenêtre masquée.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Voilà.

    C'est donc l'appel à Explorer (résident, en somme) qui fait que le psWainting n'est pas possible. Le reste (masquer la fenêtre appelant Explorer) ne l'est pas non plus en attendant la fin du processus d'Explorer.

    Je pense que c'est résolu.

    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 628
    Points : 10 553
    Points
    10 553
    Par défaut
    Je ne sais pas si tu travailles avec la VCL, mais je trouve d'une bêtise sans nom (et ce n'est pas le seul) de lancer une exception pour tout et rien

    Pour pallier cela, il faut utiliser la méthode CanFocus : if ( control->CanFocus() ) { control->SetFocus(); }

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

Discussions similaires

  1. [EXECUTION] CreateProcess / ShellExecute
    Par jmdeffet dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 14/10/2004, 10h33
  2. CreateProcess (impossible de gérer le symbole >
    Par borgirz dans le forum Windows
    Réponses: 4
    Dernier message: 03/06/2004, 10h53
  3. [CreateProcess] Comment cacher la fenêtre ?
    Par iubito dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 27/04/2004, 18h27
  4. Réponses: 2
    Dernier message: 05/04/2004, 23h06
  5. CreateProcess + paramètres passé
    Par obione dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 20/03/2003, 17h25

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