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 :

Tester la fin d’un exécutable appelé par la fonction ShellExecute


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Tester la fin d’un exécutable appelé par la fonction ShellExecute
    Salut


    Je doit passer un fichier bitmap « A.bmp » à un exécutable x.exe par un appel de ce dernier, x.exe va me traiter le fichier « A.bmp » et me créer un autre fichier bitmap« B.bmp » que je doit charger dans l’Image4 de ma Form1, j’utilise pour cet appel la fonction ShellExecute; sachant que : x.exe prend un temps pour s’exécuter . Ce temps ma poser un problème pour cela je me suis dit puisque la création de B.bmp implique la fin de l’exécution de x.exe et pour ne pas laisser l’utilisateur attendre sans réponse, j’ai pensé alors à utiliser un ProgressBar qui s’incrémente tant que le fichier B.bmp n’a pas été créer. une foie créer, le fichier B.bmp pourra être chargé dans Image4 .

    Voici le code qui résume ce que j’ai raconté :
    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
    {
    //suppression du fichier B  avant d’appeler l’exécutable 
    if (FileExists("B.bmp"))
          DeleteFile("B.bmp");
    // Apel de l’exécutable
    ShellExecute(Form1->Handle,"Open","C: \\x.exe",NULL,"C:\\",SW_HIDE);
      ProgressBar1->Min = 0;
      ProgressBar1->Max=10000;
    int  i=  ProgressBar1->Min;
    //Vérifier est ce que le fichier B.bmp a été bien créer autrement dit : est ce que l’exécution  de x ca été terminé ?? while(! (FileExists("B.bmp")))
      {   ProgressBar1->Position = i;
            i++;
        }
    //  B maintenant est créer
    ProgressBar1->Position =   ProgressBar1->Max;
    Image4->Picture->Bitmap->LoadFromFile("B.bmp");
    }
    Mon problème est que je ne peux pas charger le bitmap B dans l’Image ; à l’exécution quand le ProgressBar est mis au Max un message d’erreur me dit « impassible d’ouvrir le fichier ‘D:\\B.bmp’ ;
    Que dois je faire ?
    Est-ce qu’il ya d’autres solutions pour tester que x.exe a terminé son exécution ?
    Remarque : le temps d’exécution de x.exe vari selon le fichier A.bmp

    Merci d’avance

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, à la place de ShellExecute tu pourrais utiliser CreateProcess et pour savoir s'il est fini tu peux attendre avec WaitForSingleObject.

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    CreateProcess semble en effet être la solution, comme le suggère Crayon.

    Un petit exemple :

    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
     
        AnsiString exeName, options ;
        exeName  = "D:\\MonDossier\\MonFichier.exe" ;
        options    =" -e -n" ;
     
        PROCESS_INFORMATION ProcessInformation;
        STARTUPINFO StUpInfo;
     
        StUpInfo.cb = sizeof(StUpInfo);
        StUpInfo.lpReserved = NULL;
        StUpInfo.lpDesktop = NULL;
        StUpInfo.lpTitle = NULL;
        StUpInfo.dwFlags = 0;
        StUpInfo.cbReserved2 = 0;
        StUpInfo.lpReserved2 = NULL;
     
    //on execute le process et on attend la fin d'execution
        if (CreateProcess( exeName.c_str(), 
                          options.c_str(), NULL,NULL,true,
                          CREATE_NEW_CONSOLE,
                          NULL,NULL,
                          &StUpInfo,&ProcessInformation) )
        {
           //Attente de la fin de l'execution du Processus
           WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
        }
     
        //Fermeture des ressources
        CloseHandle( ProcessInformation.hProcess );
        CloseHandle( ProcessInformation.hThread );

  4. #4
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    Je vous remercie, sat83 et Crayon,
    J’ai fait comme vous m’avait dit sat83, on affectant le chemin de mon exécutable wt.exe au paramètre exeName, lors de l'appel une console s'affiche contenant le message d'erreur suivant:
    Error using ==>
    Too many input arguments.
    MATLAB: TooManyImputs

    En fait, wt.exe est l’exécutable de l’ m-file wt.m.

    J’ai pensé à utiliser ShellExecute avec le paramètre SW_HIDE pour cacher la console de mon exécutable wt.exe qui me gène lors de l’appel.

    est ce que vous pouvez me commenter ce message d'erreur?
    est ce qu'on peut cacher la console par cette methode ?
    Merci d’avance.

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    As tu penser a supprimer la ligne
    C'était juste un exemple au cas ou l'application attendais des paramètres...
    Si elle n'en attend pas, tu peux mettre NULL a la place de options

  6. #6
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    Citation Envoyé par sat83 Voir le message
    As tu penser a supprimer la ligne
    C'était juste un exemple au cas ou l'application attendais des paramètres...
    Si elle n'en attend pas, tu peux mettre NULL a la place de options

    Merci sat83 ; c’été bien marché, j’ai même affecté la valeur DETACHED_PROCESS au paramètre dwCreationFlags, aulieu de CREATE_NEW_CONSOLE pour cacher la console de mon exécutable.

    Maintenant je veux un moyen pour ne pas laisser l’user attendre sans réponse (le temps que wt.exe s’exécute) en lui montrant qu’une tache est en cour d’exécution, par exemple : j’ai utilisé un ProgressBar testant la fin de l’exécution de wt.exe, mais je trouve un problème pour le choix de la valeur maximale du ProgressBar, je ne connait pas au préalable le temps d’exécution de wt.exe, car il vari selon les paramètres de wt.exe.

    Voilà ce que j’ai fait :

    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
     
    void __fastcall TForm1::wtClick(TObject *Sender)
    {
     
        AnsiString exeName, options ;
        exeName  ="C:\\Process\\wt.exe" ;
     
     
        PROCESS_INFORMATION ProcessInformation;
        STARTUPINFO StUpInfo;
     
        StUpInfo.cb = sizeof(StUpInfo);
        StUpInfo.lpReserved = NULL;
        StUpInfo.lpDesktop = NULL;
        StUpInfo.lpTitle = NULL;
        StUpInfo.dwFlags = 0;
        StUpInfo.cbReserved2 = 0;
        StUpInfo.lpReserved2 = NULL;
     
    //on execute le process et on attend la fin d'execution
        if (CreateProcess( exeName.c_str(),
                          NULL, NULL,NULL,false,
                       DETACHED_PROCESS,
                          NULL,NULL,
                          &StUpInfo,&ProcessInformation) )
     
        {
           //Attente de la fin de l'execution du Processus
           ProgressBar1->Min = 0;
      ProgressBar1->Max=50000;
    int  i=  ProgressBar1->Min;
       while(i<ProgressBar1->Max)
       {ProgressBar1->Position = i;
            i++; }
           WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
     
        }
     //Fermeture des ressources
        CloseHandle( ProcessInformation.hProcess );
        CloseHandle( ProcessInformation.hThread );
     
        Image2->Picture->Bitmap->LoadFromFile("C:\\Process\\B.bmp");
     
        }
    je veux me servir de la fonction WaitForSingleObject pour tester la fin de mon exécutable.

    Est ce que vous pouvez m'aider là dessus??

    Merci d'avance.

  7. #7
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Malheureusement c'est le problème avec les traitements non fixe: impossible d'afficher une ProgressBar vu que tu ne sais pas combien de temps cela va durer...

    Une solution pour montrer à l'utilisateur qu'un traitement est en cours c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Screen->Cursor = crHourGlass ; //affiche le sablier
    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    Screen->Cursor = crDefault; //affiche le curseur par defaut
    Sinon afficher un "SplashScreen" indiquant qu'un traitement est en cours...

  8. #8
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut,
    Une solution pour montrer à l'utilisateur qu'un traitement est en cours c'est:
    Code :
    Screen->Cursor = crHourGlass ; //affiche le sablier
    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    Screen->Cursor = crDefault; //affiche le curseur par defaut
    Merci sat83, pour votre proposition, ça marche très bien, j’ai ajouter un composant Image2 et un bouton nommé Charger à ma fiche.
    Voila ce que doit faire le bouton Charger:
    • charge une image (par explorateur) dans Image1.
    • enregistrer l’image chargée dans un fichier nommé A.bm.
    Et voilà mon bouton WT qui doit
    • Appeler mon exécutable par CreateProcess Qui va (traiter A.bmp et enregistrer le résultat dans un autre fichier nommé Destination.bmp).
    • Charger le fichier Destination.bmp dans Image2
    Alors j’avais un problème au niveau du bouton WT, qui ne s’exécute pas si je lui charge une image par le bouton charger, par contre l’exécution se fait normalement si je clique directement sur WT
    Est-ce que vous pouvez m’aider là dessus ?
    Merci bien !

  9. #9
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Je n'ai pas trop compris votre problème...

    Est-il possible d'avoir un extrait du code du bouton WT, et eventuellement du bouton Charger? (Si c'est pas trop long)

  10. #10
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut sat 83
    Citation Envoyé par sat83 Voir le message
    Je n'ai pas trop compris votre problème...

    Est-il possible d'avoir un extrait du code du bouton WT, et eventuellement du bouton Charger? (Si c'est pas trop long)
    j'ai dans la fiche 2 images: Image1, Image2 et 2 boutons Charger et WT.

    Voilà le code du bouton Charger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::ChargerClick(TObject *Sender)
    {
    //Chargement d'image..
    if(OpenPictureDialog1->Execute())
    Image1->Picture->Bitmap->LoadFromFile(OpenPictureDialog1->FileName);
     
    // Enregistrer l'image dans : "C:\\Process\\originale.bmp"..
    Image1->Picture->SaveToFile("C:\\Process\\originale.bmp");
    // le fichier originale.bmp sera l'entrée de wt.exe appelé par la fonction CreateProcess dans le bouton WT.
    }
    et celui de WT:
    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
    void __fastcall TForm1::WTClick(TObject *Sender)
    {
     
        AnsiString exeName, options ;
        exeName  ="C:\\Process\\wt.exe" ;
        PROCESS_INFORMATION ProcessInformation;
        STARTUPINFO StUpInfo;
        StUpInfo.cb = sizeof(StUpInfo);
        StUpInfo.lpReserved = NULL;
        StUpInfo.lpDesktop = NULL;
        StUpInfo.lpTitle = NULL;
        StUpInfo.dwFlags = 0;
        StUpInfo.cbReserved2 = 0;
        StUpInfo.lpReserved2 = NULL;
     
        if (CreateProcess( exeName.c_str(),
                          NULL, NULL,NULL,false,
                       DETACHED_PROCESS,
                          NULL,NULL,
                          &StUpInfo,&ProcessInformation) )
    // wt.exe va lire le fichier "C:\\Process\\originale.bmp",le traiter et enregistrer le résultat dans "C:\\Process\\Destination.bmp".
     
        {
     
    Screen->Cursor = crHourGlass ; //affiche le sablier
    WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    Screen->Cursor = crDefault; //affiche le curseur par defaut
        }
        //Fermeture des ressources
        CloseHandle( ProcessInformation.hProcess );
        CloseHandle( ProcessInformation.hThread );
    //afficher le résultat dans Image2
        Image2->Picture->Bitmap->LoadFromFile("C:\\Process\\Destination.bmp");
     
        }
    Au début je n’avais que le bouton WT et Image2 dans ma fiche et le fichier originale.bmp dans le répertoire de mon application : C:\\Process.
    En cliquant sur le Bouton WT :
    wt.exe est appelé par la fonction CreateProcess (wt.exe lit le fichier "C:\\Process\\originale.bmp " le traite et enregistre le résultat dans "C:\\Process\\Destination.bmp ").
    "C:\\Process\\Destination.bmp" sera charger par la suite dans Image2.
    Le traitement été donc fixe (concerne qu’une seule image qui est "C:\\Process\\originale.bmp ").
    J’ai pensé alors à ajouter le bouton Charger pour rendre variable le traitement (traiter plusieurs images).
    Le bouton Charger enregistre l’image chargée dans : "C:\\Process\\originale.bmp ".
    Et le traitement se poursuit comme je vous ai expliqué au paravent.
    Le problème à l’exécution est comme suit :
    Quand je charge une image par Le bouton Charger et je clique sur WT, la partie du code CreateProcess ne s’exécute pas. Et sur l’image 2 s’affiche le contenu du fichier "C:\\Process\\Destination.bmp", par contre si je clique à l'éxécution sur le bouton WT sans charger une image, WT s'exécute normalement et m'affiche dans Image2 le résultat corecte ("C:\\Process\\Destination.bmp", qui est le traitement de l'image "C:\\Process\\originale.bmp").

    je m'excuse pour la langueur du message

    Voilà,j'espére avoir pu vous expliquer.

    Merci d'avance.

  11. #11
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Est tu sûr que le CreateProcess ne s'exécute pas? A mon avis il dois s'exécuter...
    Le programme wt.exe c'est un programme a toi?

    Pour vérifier que le [B]CreateProcess[/B ]s'exécute bien, execute ton code en mode pas-à-pas (tu met un point d'arrêt dans la procédure de ton bouton WT, et a ensuite tu execute en pas-à-pas avec F8). Là tu pourra voir si le CreateProcess est effectivement lancer (a mon avis il l'est), et voir pourquoi wt.exe ne fais rien.

    Bon courage

  12. #12
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Est tu sûr que le CreateProcess ne s'exécute pas? A mon avis il dois s'exécuter...
    Oui.
    Le programme wt.exe c'est un programme a toi?
    Oui.

    Wt.exe va lire un fichier originale.bmp le traiter et enregistrer le résultat dans Destination.bmp.
    Je vais vous citez 2 cas de figure en exécutant mon programme :
    1er cas :
    Je clique sur WT sans charger une image alors le résultat qui s’affiche dans Image2 est correcte (wt.exe marche bien).
    2eme cas :
    Je charge une image (sachant qu’au chargement je sauvegarde l’image chargée dans originale.bmp).
    Je clique sur WT, déjà le temps de réponse est réduit et l’image affichée correspond au fichier original.bmp de l’exécution passée.
    Donc si je veux traiter l’image chargée (2eme cas de figure) je dois fermer mon exécution et ré exécuter puis cliqué sur WT, pour avoir un bon résultat.
    On constate que wt.exe n’accepte (ne traite pas) l’image chargée, pourtant je l’enregistre dans originale.bmp qui est son entrée.
    J’ai pensé même à séparé entre les 2 boutons Charger et WT en les mettant dans des formes différentes mais le problème persiste toujours.
    Que dois-je faire ???

    Merci d'avance!!

  13. #13
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Ce n'est pas la cause du problème mais modifie ton bouton chargée comme çi-dessous, sinon tu sauvegarde une image vide lorsque tu clique sur Annuler de ton OpenDialog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::ChargerClick(TObject *Sender)
    {
    //Chargement d'image..
    if(OpenPictureDialog1->Execute())
    {
        Image1->Picture->Bitmap->LoadFromFile(OpenPictureDialog1->FileName); 
    // Enregistrer l'image dans : "C:\\Process\\originale.bmp"..
        Image1->Picture->SaveToFile("C:\\Process\\originale.bmp");
    }
    }
    Si le CreateProcess ne s'exécute pas correctement, c'est de ce coté là qu'il faut chercher: Pourquoi il n'arrive pas a créer le process wt.exe? Regarde dans l'aide de CreateProcess (tu verra qu'en utilisant GetLastError tu pourra identifier la cause de la non-création du process) pour essayer de déterminer pourquoi le process n'est pas créer.

  14. #14
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    merci pour la corréction du bouton charger.
    Mon Pb problème persiste toujours.

    Citation Envoyé par sat83 Voir le message
    ....
    Regarde dans l'aide de CreateProcess (tu verra qu'en utilisant GetLastError tu pourra identifier la cause de la non-création du process) pour essayer de déterminer pourquoi le process n'est pas créer.
    voilà ce que j'ai trouver pour GetLastError()
    renvoie la dernière erreur rapportée par un appel à une API dans le système d'exploitation. L'appel de cette fonction réinitialise habituellement l'état d'erreur du système d'exploitation.

    Comment je peux me servir de cette fonction?
    Autrement dit : Comment implémenter cette fonction dans mon code ?


    Merci d'avance!

  15. #15
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(CreateProcess(exeName.c_str(),NULL, NULL,NULL,false, DETACHED_PROCESS,NULL,NULL,&StUpInfo,&ProcessInformation)) 
    {
       Screen->Cursor = crHourGlass ; //affiche le sablier
       WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
       Screen->Cursor = crDefault; //affiche le curseur par defaut
    }
    else 
       ShowMessage( GetLastError() ) ;

  16. #16
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    salut sat83

    Bizarre !! J’ai fait ce que vous m’avais montré là-dessus et je n’ai eu aucun message d’erreur.


  17. #17
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    A ben si vous n'avez pas eu de message d'erreur, c'est que le CreateProcess s'est bien déroulé!

    Pour vous en assuré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(CreateProcess(exeName.c_str(),NULL, NULL,NULL,false, DETACHED_PROCESS,NULL,NULL,&StUpInfo,&ProcessInformation)) 
    {
    // le Create Process s'est bien déroulé
       ShowMessage( "LE CreateProcess S'EST BIEN DéROULé" ) ;  
       Screen->Cursor = crHourGlass ; //affiche le sablier
       WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
       Screen->Cursor = crDefault; //affiche le curseur par defaut
    }
    else // le Create Process ne s'est pas bien déroulé
       ShowMessage( GetLastError() ) ;
    Donc le problème vient a priori bien de votre application wt.exe qui ne fais pas bien son travail...

  18. #18
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Il y a moyen de regarder ce que le programme appelé retourne comme valeur (Exit Code). Habituellement si ce n'est pas zéro, c'est qu'il y a eu un problème.

  19. #19
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Salut

    Citation Envoyé par sat83 Voir le message
    ...

    Donc le problème vient a priori bien de votre application wt.exe qui ne fais pas bien son travail...
    je vous comfirme que mon application wt.exe s'exécute normalement.

    la preuve elle s'est éxécuté par CreateProcess avant d'ajouter le bouton Charger, de plus je l'est exécuté séparément et me donne le résultat atendu.
    Il y a moyen de regarder ce que le programme appelé retourne comme valeur (Exit Code). Habituellement si ce n'est pas zéro, c'est qu'il y a eu un problème.
    Hier 17h20
    mon application wt.exe est de type void et n'a pas de paramètres, elle manipule les fichier originale.bmp et Destination.bmp .

    Merci pour votre aide

Discussions similaires

  1. Appel d'une méthode Java après fin d'exécution d'une procédure stockée
    Par ishika83 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 18/08/2014, 15h40
  2. [XL-2010] Reprise d'une macro 1 après exécution d'une macro 2 appelée par la macro 1
    Par julio44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2014, 12h32
  3. [XL-2003] Restreindre valeurs des paramètres appelés par une fonction
    Par azerty_2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/03/2011, 08h50
  4. script appellé par une fonction aveugle aux workspace
    Par Zhitoune dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 16/12/2008, 17h07
  5. Réponses: 6
    Dernier message: 09/01/2007, 01h15

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