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

C++Builder Discussion :

Comment attendre la fin d'un process lancé par ShellExecute ou ShellExecuteEx [Débutant]


Sujet :

C++Builder

  1. #1
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut Comment attendre la fin d'un process lancé par ShellExecute ou ShellExecuteEx
    Bonjour,

    je dois lancer le Setup d'un programme via mon exécutable C++BuilderXE et attendre la fin de ce setup pour continuer.

    J'ai pensé utiliser ShelleExecuteEx car je l'ai déjà fait en Vba. (sans tester la fin du code appelé mais en récupérant le hwnd pour tuer le process plus tard).

    J'ai trouvé le code suivant en Delphi qui me parait adapté, mais étant plus que débuttant en C++(et Builder) je ne parviens pas à coder le protoype dans mon.h et la ligne de définition de ma fonction dans mon Form.

    Voici le code delphi.

    JE cite :
    Le paramètre "voir" permet d'afficher ou non le programme lancé (c'est pratique), les autres paramètres se passe d'explication .


    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function ExecuteWait(Programme, parametres :string;voir :Boolean):Boolean;
    Implémentation :
    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
    // Fonction permettant de lancer un programme externe et d'attendre la fin de celui-ci avant de continuer
    Function TForm1.ExecuteWait(Programme, parametres :string;voir :Boolean):Boolean;
    var ShExecInfo : TShellExecuteInfo;
    begin
     try
       FillChar(ShExecInfo, SizeOf(ShExecInfo), 0);
       with ShExecInfo do
          begin
             cbSize := SizeOf(ShExecInfo);
             fMask  := SEE_MASK_NOCLOSEPROCESS;
             lpFile := PChar(Programme);      { le nom du programme }
             lpParameters := PChar(Parametres); { Les paramètres }
             lpVerb := 'open';
             if voir = True then nShow := SW_SHOW else nShow := SW_HIDE;
         end;
       if ShellExecuteEx(@ShExecInfo) then
           begin       { on execute le programme }
               WaitForSingleObject(ShExecInfo.hProcess, INFINITE); { on attends un temps indefinie que l'appli s'arrete }
           end;
       result := True;
     except
       result := False;
     end;
    end;
    Je calle sur 3 choses (au moins) :
    1) Le prototype dans mon .h (en gras)
    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
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    	TImage *Image1;
    	TLabel *Label1;
    	TLabel *Label2;
    	TLabel *Label3;
    	TLabel *Label4;
    	void __fastcall FormCreate(TObject *Sender);
    private:	// Déclarations utilisateur
    public:		// Déclarations utilisateur
    	__fastcall TForm1(TComponent* Owner);
    	  bool Check_Pcx_Converter(void);
          bool ExecuteWait(String, String, Boolean);
    };
    2) La fonction en elle-même (en gras)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //---------------------------------------------------------------------------
    //# bool TForm1::ExecuteWait(Prog , Parms, Voir)
    //   Execute an application and Wait until completion
    //   Voir Allows display or not
    //---------------------------------------------------------------------------
    bool TForm1::ExecuteWait(Prog, Parms:String, Voir:Boolean)
    {
    3) La définition de la classe ShExecInfo.

    Si qqun peut éclairer ma lanterne cela ferait drôlement avancer mon Schmilblick.

    A La compil j'obtiens [BCC32 Erreur] UnitImage.cpp(119): E2238 Déclaration multiple pour 'TForm1::ExecuteWait' sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool TForm1::ExecuteWait(Prog, Parms:String, Voir:Boolean)
    et je ne comprend pas pourquoi.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    dans ton .h
    bool ExecuteWait(AnsiString , AnsiString , Boolean);
    Boolean n'est pas un type C, la syntaxe c ou c++ cela doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool __fastcall ExecuteWait(AnsiString Programme,AnsiString parametres,bool voir);
    dans ton . cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool __fastcall  TForm1::ExecuteWait(AnsiString Programme,AnsiString  parametres, bool voirAnsiString {
    }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Impec.

    Merci beaucoup pour la réponse hyyyper rapide.

    C'est pour la fonction et son proto.

    Mais j'ai encore besoin d'un petit coup de main pour la définition de la classe ShExecInfo.

    Si qqun peut éclairer ma lanterne cela ferait drôlement avancer mon Schmilblick.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Voilà,

    j'ai trouvé.

    Ma solution. si qqun est intéressé.
    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
    //---------------------------------------------------------------------------
    //# bool TForm1::ExecuteWait(Prog , Parms, Voir)
    //   Execute an application and Wait until completion
    //   Voir Allows display or not
    //---------------------------------------------------------------------------
    bool __fastcall  TForm1::ExecuteWait(String Programme,String  parametres, bool voir)
    {
      SHELLEXECUTEINFO execinfo;      // Structure ShellExecute(Ex) info
     
      //typedef struct _SHELLEXECUTEINFO {
      //	DWORD cbSize;
      //	ULONG fMask;
      //	HWND hwnd;
      //	LPCTSTR lpVerb;
      //	LPCTSTR lpFile;
      //	LPCTSTR lpParameters;
      //	LPCTSTR lpDirectory;
      //	int nShow;
      //	HINSTANCE hInstApp;
      //	LPVOID lpIDList;
      //	LPCTSTR lpClass;
      //	HKEY hkeyClass;
      //	DWORD dwHotKey;
      //	union {
      //		HANDLE hIcon;
      //		HANDLE hMonitor;
      //	} DUMMYUNIONNAME;
      //	HANDLE hProcess;
      //} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
     String action;                                 // action to run
     
      action =  "open";
      memset(&execinfo, 0, sizeof(execinfo));
      execinfo.lpFile = Programme.c_str();          // programme
      execinfo.cbSize = sizeof(execinfo);
      execinfo.lpVerb = action.c_str();             // Action = Open
      execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
      execinfo.lpParameters = parametres.c_str();   // Parms
      if ((voir)){                                  // Show Process or not
    	 execinfo.nShow = SW_SHOW;
    	}
    	else {
    	 execinfo.nShow = SW_HIDE;
      }
      if (ShellExecuteEx(&execinfo)) {
    		WaitForSingleObject(execinfo.hProcess, INFINITE);
    		return TRUE;
    	  }
    	  else {
    		return FALSE;
       }
     
    }
    //---------------------------------------------------------------------------
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

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

Discussions similaires

  1. [Vista]Comment attendre la fin d'exécution d'un processus ?
    Par gb_68 dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 15/06/2007, 23h17
  2. [Process] comment attendre la fin du chargement?
    Par elflamby dans le forum VB.NET
    Réponses: 1
    Dernier message: 03/04/2007, 15h04
  3. [VB.net] Comment attendre la fin d'un programme ?
    Par nakata77 dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/09/2006, 17h16
  4. [Thread] comment attendre la fin d'un thread?
    Par billynirvana dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 24/08/2005, 10h43
  5. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 16h35

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