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 :

redirection de la sortie d'un programme dos


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut redirection de la sortie d'un programme dos
    Bonjour,

    J'ai développé un programme qui lance des exe. Pour ce faire, j'ai dû récupéré la sortie de mon programme afin de l'écrire dans un fichier log. J'ai utilisé pour cela le code donné dans la FAQ c++ par nico-pyright et je l'ai adapté :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    bool interfaceClassWithFile::executeCmdWithRedirection(CString nomFichierEntree)
    { 
    	SECURITY_DESCRIPTOR sd; 
    	SECURITY_ATTRIBUTES sa;
     
    	HANDLE	hReadPipe, 
    		hWritePipe; 
     
     
    	STARTUPINFO si; 
    	PROCESS_INFORMATION pi; 
     
    	LPVOID	lpMsgBuf;
     
    	DWORD	BytesRead, 
    		lu; 
     
    	char	dest[BUFFER],
    		lpFileName[100],
    		dateStr [9]; 
     
    	CString	strExec;
     
    	_strdate( dateStr);
    	sDate = dateStr;
    	sDate.Replace("/", "_");
     
    	sCheminL += "\\ImportHPRIM_" + sDate + ".log";
     
    	strExec = "\"" + sCheminE + "\"<" + sCheminF;
     
    	InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
    	SetSecurityDescriptorDacl(&sd, true, NULL, false); 
    	sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
    	sa.bInheritHandle = true; 
    	sa.lpSecurityDescriptor = &sd; 
     
    	if (! CreatePipe(&hReadPipe, &hWritePipe, &sa, NULL)) 
    		return false; 
     
    	memset(&si, 0, sizeof(STARTUPINFO)); 
    	si.cb = sizeof(STARTUPINFO); 
    	si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES; 
    	si.wShowWindow = SW_SHOW; 
    	si.hStdOutput = hWritePipe; 
    	si.hStdError = hWritePipe;
     
     
     
    	if ( ! CreateProcess(NULL, strExec.GetBuffer(1000), NULL, NULL, FALSE, 0, 0, 0, &si, &pi) ) 
    	{
    		cout << strExec.GetBuffer(1000) << endl;
    		FormatMessage(
    			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    			FORMAT_MESSAGE_FROM_SYSTEM,
    			NULL,
    			GetLastError(),
    			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    			(LPTSTR) &lpMsgBuf,
    			0, NULL );
     
    		printf( "CreateProcess failed (%s).\n", lpMsgBuf);
    		LocalFree(lpMsgBuf);
    		return false; 
    	}
    	WaitForSingleObject(pi.hProcess, INFINITE); 
     
    	lstrcpy(lpFileName, sCheminL);
    	hFichier = CreateFile(lpFileName, GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
    	if( hFichier == INVALID_HANDLE_VALUE) 
    		return false; 
     
    	memset(dest, 0, BUFFER); 
     
    	while (ReadFile(hReadPipe, dest, BUFFER, &BytesRead, NULL)) 
    	{ 
    		if (!BytesRead) 
    			break; 
    		WriteFile(hFichier, dest, BytesRead, &lu, NULL); 
    		if (BytesRead<BUFFER) 
    			break; 
    	} 
    	CloseHandle(hFichier); 
    	CloseHandle(hReadPipe); 
    	CloseHandle(hWritePipe); 
    	return true; 
    }
    Mon problème est que le programme bloque au niveau du while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (ReadFile(hReadPipe, dest, BUFFER, &BytesRead, NULL))
    Il n'y a pas d'erreur, mais le programme se bloque, plus rien ne répond, je suis obligé de tuer le programme.

    Quelqu'un aurait-il une idée ?
    pleaseeeeee

  2. #2
    Membre expérimenté Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Par défaut
    Pour un pipe anonyme, ReadFile() ne rend la main que dans les cas suivants :
    ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs.
    Je ne sais pas si ça peut t'aider. Essaye d'appeler PeekNamedPipe() (fonctionne également pour les pipes anonymes) qui permet de vérifier s'il y a quelquechose dans le tuyau avant d'appeler ReadFile().

  3. #3
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    C'est plus complexe que ça. Y'a une pirouette à faire pour que ton pipe se ferme quand le processus fils se termine, à cause de l'héritage des handle.
    Heureusement tout est fait ici:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;190351

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/11/2006, 16h10
  2. [C#] Récupérer la sortie d'un programme DOS
    Par olivier_23 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/08/2006, 14h54
  3. A la sortie de la programmation DOS, WINDEV ? DELPHI ? ou ?
    Par zanimox dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 18/08/2005, 18h25
  4. Réponses: 4
    Dernier message: 04/07/2003, 20h13

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