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 :

probleme pour garder la main avec un shellExecuteEx


Sujet :

MFC

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Par défaut probleme pour garder la main avec un shellExecuteEx
    Bonjour, dans mon programme j'ai un shellExecuteEx pour copier un fichier.

    j'aimerai pouvoir détruire ce processus lorsque j'appuie sur un bouton de la toolbar de l'application.

    En effet, lorsque l'utilisateur appuie sur le bouton, "bInterrompu" passe à "true". ce qui doit permettre d'effectuer un ExitProcess(0);


    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
     
    SHELLEXECUTEINFO sei; 
    	ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); 
    	sei.cbSize = sizeof(SHELLEXECUTEINFO ); 
    	sei.lpFile = "xcopy.exe"; 
    	sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
    	sei.lpVerb = TEXT("open"); 
    	sei.nShow = SW_HIDE; 
     
    	CString aa = "\"C:\\temp\\"+prestation+".zip\" \""+theApp.GetStrData()+"\\"+theApp.GetStrUA()+"\\"+prestation+".zip\" /Y";
    	sei.lpParameters = aa;
    	if(ShellExecuteEx(&sei)) 
    	{ 
    	int pas =0;
     
     
     
    		DWORD result = WaitForSingleObject(sei.hProcess, 1000);
    		while (result == WAIT_TIMEOUT)
    		{
    			if(theApp.bInterrompu==true)
    			{
    				ExitProcess(0);
    				result=WAIT_ABANDONED;
    			}
    			else
    			{
     				pas+=2;
    				if (pas < 175)
     					pFrame->GetStatusBar()->SetPaneProgress(1,pas);
     
    								        result = WaitForSingleObject(sei.hProcess, 1000);
    			}
    		}
     
    		if(result==WAIT_ABANDONED)
    			pFrame->GetStatusBar()->SetPaneProgress(1,0);
    		else
    			pFrame->GetStatusBar()->SetPaneProgress(1,200);
    	}
    	::CloseHandle(sei.hProcess);

    mon problème est que je n'arrive pas à appuyer sur mon bouton..
    je pense que c'est parce qu'il y a un "waitforsingleObject", du coup je perds la main sur l'application...

    comment je peux faire, pour garder la main (pour pouvoir appuyer sur le bouton)?

    sachant que j'ai utilisé "waitforsingleobject" parce que je voulais que mon programme attende que la copie soit totalement finie pour pouvoir continuer...

    j'ai trouvé une fonction : GetExitCodeProcess( hProcess, DLPWORD.. ); qui permet de savoir si le processus est toujours actif ou pas... mais est-ce que ca peut vraiment me servir parce que pour l'instant j'arrive pas a l'utiliser pour ce que je veux faire

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Par défaut
    voila ce que j'ai essayé:

    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
     
     
    	SHELLEXECUTEINFO sei; 
    	ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); 
    	sei.cbSize = sizeof(SHELLEXECUTEINFO ); 
    	sei.lpFile = "xcopy.exe"; 
    	sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
    	sei.lpVerb = TEXT("open"); 
    	sei.nShow = SW_HIDE; 
     
    	CString aa = "\"C:\\temp\\"+prestation+".zip\" \""+theApp.GetStrData()+"\\"+theApp.GetStrUA()+"\\"+prestation+".zip\" /Y";
    	sei.lpParameters = aa;
    	if(ShellExecuteEx(&sei)) 
    	{ 
     
    		int pas = 0;
    		CString phrase;
    		DWORD dwExitCode = 0;
    		GetExitCodeProcess(sei.hProcess, &dwExitCode);
    		while(dwExitCode == STILL_ACTIVE) //process toujours présent ?
    		{
    			// toujours la.
     
    			pas += 5;
    			phrase="transfert en cours :"+ pas;
    			pFrame->GetStatusBar()->SetWindowText(phrase);
    			GetExitCodeProcess(sei.hProcess, &dwExitCode);
    		}
    AfxMessageBox("fin du transfert");
    	}
    	::CloseHandle(sei.hProcess);
    mais ca boucle indéfiniment.. donc je suppose que je l'utilise pas bien...

    sinon j'avais penser a faire le shellExecute à partir d'une boite de dialog... mais pour ca il faudrai que je garde quand meme la main sur la fenetre principale principal hors quand une CDialog est ouverte on peut pas atteindre la fenetre principale... si quelqu'un a une solution...

Discussions similaires

  1. [Smarty] Un probleme pour passer des variables avec Smarty
    Par aztec dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/03/2008, 15h01
  2. Réponses: 1
    Dernier message: 14/11/2007, 13h11
  3. Python probleme pour traitement fichier Xml avec l'API dom
    Par chenimitz dans le forum Général Python
    Réponses: 11
    Dernier message: 30/10/2007, 19h34
  4. Probleme pour lancer un .sh avec cron
    Par Devether dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 06/09/2007, 10h48
  5. probleme pour tracer une ligne avec OleExcel
    Par blondelle dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/08/2006, 19h10

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