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

MFC Discussion :

ShellExecuteEx ne s'execute pas à chaque fois??


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut ShellExecuteEx ne s'execute pas à chaque fois??
    Bonjour, je m'explique, avec le code suivant qui se trouve dans une boucle (avec str_cmd qui change à chaque tour), ma commande n'est pas correctement executé à chaque fois (ne fais pas les modification demandé par la commande).
    Le probleme, c'est que c'est alléatoire, des fois ca se faiut des fois ca se fait pas....
    Au début, je pensais que c'etait parce que ca s'executait trop vite, donc j'ai mis l'attente de fin du processus, mais ca ne change rien...

    Je comprends plus......

    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
    						SHELLEXECUTEINFO ExecuteInfo;    
    							memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));
     
    							ExecuteInfo.cbSize       = sizeof(ExecuteInfo);
    							ExecuteInfo.fMask        = 0;                
    							ExecuteInfo.hwnd         = this->m_hWnd;                
    							ExecuteInfo.lpVerb       = "open";                      
    							ExecuteInfo.lpFile       = str_chemin;
    							ExecuteInfo.lpParameters = str_cmd;
    							ExecuteInfo.lpDirectory  = 0;
    							ExecuteInfo.nShow        = SW_HIDE;//;SW_SHOW;//
    							ExecuteInfo.hInstApp     = 0;    
    							if(ShellExecuteEx(&ExecuteInfo) == FALSE)
    							{
    							// erreur
    							MessageBox("erreur ex","ex",32);
    							}else{
     
    							// attente
    							WaitForSingleObject(ExecuteInfo.hProcess, INFINITE); 
     
    							}
    MERCI POUR VOTRE AIDE!!!!!

    EDIT : truc, tres bizarre, des que je met un MessageBox() avant et apres, ca marche nickel à tous les coups, je comprend vraiment plus rien......

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Au final, pour que ca marche, je suis obligé de mettre un Sleep de 10ms, alors c'est vraiment pas top, je comprend tjs pas...
    Si quelqu'un a une idée?

  3. #3
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    le sleep faisant "dormir" ton thread, il n'influance pas le shellexecute. En revenche, il se peut que cela viennent du programme appellé par shellexecute
    il y a du linge sur la corde à linge

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Points : 115
    Points
    115
    Par défaut
    si le programme exécuté par ShellExecute n'est pas terminé, peut etre que zindoze empêche son ecécution en double (ou peut etre meme que c lui qui l'empêche)

  5. #5
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Cela dépend aussi comment est conçu ShellExecuteEx, si il utilise une espèce de buffer ou pas... ou un thread qui lance un autre thread, et donc une limitation sur 1 thread lancé à chaque fois. Il peut y avoir plein de raisons !

    Et un sleep de 10ms c trop pour toi ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Bon, aux dernieres nouvelles, le programme ne fonctionne pas correctement avec le Sleep sur d'autre PC (peut etre ai-je eu un coup de peau?).

    Comment faire pour être sur que la dernière execution est terminée avec de relancer la suivante? (si le Sleep endort le thread aussi...)

    Cette fonction : WaitForSingleObject() ne marche pas correctement?

    Si cela vient du programme executé, d'ou cela peut-il venir?

    Merci à vous

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    La meme chose executée avec system() marche correctement.

    Mais que ce passe-t-il avec ShellExecuteEx??

    (Je laisserais bien ca avec system, mais ca fait pas tres professionnel les fenetre DOS qui s'ouvre....)


  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    quel est le type de programme que tu lances ? un programme win32 ? des lignes de commande DOS ?

    WaitForSingleObject devrait fonctionner correctement

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    C'est un programme dos, une application console.

    Pour WaitForSingleObject, je viens de tester en lancant photoshop à la place de mon application console et ca ne fonctionne pas, je passe directement apres WaitForSingleObject (je teste par MessageBox).

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Ceci fonctionne chez moi :
    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
    	SHELLEXECUTEINFO execinfo;
    	memset(&execinfo, 0, sizeof(execinfo));
     
    	execinfo.lpFile = "c:\\install.exe";
    	execinfo.cbSize = sizeof(execinfo);
    	execinfo.lpVerb = "open";
    	execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    	execinfo.nShow = SW_SHOWDEFAULT;
    	execinfo.lpParameters = "";
     
    	if (!ShellExecuteEx(&execinfo))
    	{
    		LPVOID lpMsgBuf; 
    		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &lpMsgBuf, 0, NULL); 
    		MessageBox(NULL,(LPCTSTR)lpMsgBuf,"",MB_ICONSTOP); 
    		LocalFree( lpMsgBuf );
    	}
    	WaitForSingleObject(execinfo.hProcess, INFINITE);
    	MessageBox(NULL,"Fini","",MB_ICONSTOP);
    Si ce sont des commandes dos, tu peux utiliser l'interpréteur de commande pour les lancer correctement (en lancant cmd.exe avec comme parametre "/C nomProg.exe")

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Effectivement, c'est beaucoup mieux avec SEE_MASK_NOCLOSEPROCESS 8)

    Merci

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Ne pas oublier le CloseHandle sur execinfo.hProcess

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

Discussions similaires

  1. [MySQL] scripte qui semble ne pas s'executer à chaque fois
    Par jmsch dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/02/2013, 22h33
  2. Un getter qui ne renvoie qu'une fois les données pas à chaque fois
    Par tonytrua dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/12/2011, 22h05
  3. Réponses: 6
    Dernier message: 01/11/2010, 21h42
  4. Réponses: 4
    Dernier message: 09/05/2007, 14h41
  5. [Oracle] Ne pas générer la requète a chaque fois.
    Par lechewal dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/06/2006, 11h20

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