Accueil > Forum > > > > Redirection sortie
Redirection sortie
mercredi 2 août 2006 à 17:06:57 |
Redirection sortie

M5i9k
|
Bonjour à tous, je voudrais lire la sortie d'une console lancée à partir de mon programme (j'utilise CreateProcess), je voudrais savoir si je suis sur la bonne route voici comment je m'y prend : int _tmain(int argc, _TCHAR* argv[]) { char *lpExeName = "prog.exe"; STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE hFile; char buffer[4096]; DWORD dwReaded; hFile = CreateFile("data.txt", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(!hFile) cout << "Erreur de creation de fichier"; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = hFile; ZeroMemory(&pi, sizeof(pi)); if(!CreateProcess(lpExeName, "/c dir", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) cout << "Erreur de creation de processus!"; if(!ReadFile(hFile, buffer, sizeof(buffer), &dwReaded, NULL)) cout << "Erreur de lecture du flux"; buffer[dwReaded] = '\0'; cout << "Octets lus : " << dwReaded << endl << buffer; if(hFile) CloseHandle(hFile); return 0; } En gros je crée un fichier pour enregistrer la sortie de la console, avec si.hStdOutput je redirige la sortie du processus vers le fichier (je suppose), et ensuite je tente d'afficher la sortie en lisant le fichier, mais le problème est que dwReaded vaut toujours 0, ça me donne donc "Octets lus : 0", je ne comprends pas pourquoi... Le programme conpile sans erreur et il n'y à pas d'erreur lors de l'execution. Si quelqu'un pourrait me dire où se trouve l'erreur... Merci d'avance.
|
|
mercredi 2 août 2006 à 17:54:32 |
Re : Redirection sortie
|
mercredi 2 août 2006 à 21:31:07 |
Re : Redirection sortie

M5i9k
|
euh, oui j'aimerais savoir hooker les fonctions mais c'est encore trop compliqué pour moi  , sinon je ne vois pas comment récuperer le texte de la console en fesant cela, est-ce que tu pourrais detailler ton idée ? 
|
|
mercredi 2 août 2006 à 22:24:22 |
Re : Redirection sortie
|
mercredi 2 août 2006 à 22:35:40 |
Re : Redirection sortie

M5i9k
|
Ok, j'avais déja essayer les pipes mais ça me paraissait compliqué je vais reessayer en lisant l'aide. Merci pour le lien.
|
|
mercredi 2 août 2006 à 22:38:58 |
Re : Redirection sortie
|
jeudi 3 août 2006 à 00:22:51 |
Re : Redirection sortie

M5i9k
|
Voici mon ancien code avec les tubes (pipes) :
char *lpExeName = "prog.exe"; STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE hOutput, hInput; DWORD dwReaded; char buffer[4096];
if(!CreatePipe( &hOutput, &hInput, NULL, 0)) cout << "Erreur de création de pipe";
ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = hOutput; si.hStdInput = hInput;
ZeroMemory(&pi, sizeof(pi));
if(!CreateProcess(lpExeName, "/c dir", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) cout << "Erreur de creation de processus!";
if(!FlushFileBuffers(hOutput)) cout << "Erreur Flush()"; if(!ReadFile(hOutput, buffer, 15, &dwReaded, NULL)) cout << "Erreur de lecture du flux";
if(hOutput) CloseHandle(hOutput); if(hInput) CloseHandle(hInput);
le problème est que le programme se bloque au niveau de ReadFile(...) je ne comprends pas pourquoi, j'ai donc ajouté FlushFileBuffers(...) mais sa n'a rien changé...
|
|
jeudi 3 août 2006 à 00:39:58 |
Re : Redirection sortie

vecchio56
|
Je crois que tu te mélanges les pinceaux Déja soyons logique, on inverse les deux premiers arguments de CreatePipe: CreatePipe(&hInput, &hOutput, NULL, 0); si.hStdOutput = hOutput; // OK, le processus va écrire dans le tube si.hStdInput = hInput; // si on fait ca le processus va lire le tube, il ne faut pas Et la lecture doit se faire sur hInput: ReadFile(hInput, ...) Tu peux aussi enlever FlushFileBuffersEnfin, petit détail, read est un verbe irrégulier, et le participe passé est read (qu'on prononce red). Tu devrais donc appeler ta variable dwRead et non dwReaded (on a quand même 231 réponses dans google pour dwReaded) (oui j'ai que ça a faire de chercher) _____________________________________ Un éditeur de ressources gratuit pour Windows
|
|
jeudi 3 août 2006 à 00:56:21 |
Re : Redirection sortie

M5i9k
|
Mdrrrrrrr Ok j'ai modifié mon code pour mettre dwRead , par contre je ne comprends pas trop le fonctionnement des tubes : On écrit dans la sortie(hOutput) et on lit dans l'entrée(hInput)? ou plutôt écrire dans l'entrée et lire dans la sortie ? Je pense que le processus crée écrit dans la sortie du tube donc dans hOutput et donc c'est bien hOutput que je dois lire non? Car pour moi, hInput correspond à l'entrée donc le clavier par exemple.
CreatePipe( PHANDLE hReadPipe, PHANDLE hWritePipe...)
hReadPipe = Sortie, hWritePipe = Entrée ou le contraire???
En remplaçant tout sa, j'ai toujours le même problème : le programme bloque sur ReadFile().
|
|
jeudi 3 août 2006 à 01:04:54 |
Re : Redirection sortie

vecchio56
|
CreatePipe Le premier param est le pipe de lecture (celui dans lequel on va lire). Le deuxième est celui dans lequel on écrit. En l'occurence ce n'est pas nous qui écrivons mais un autre processus, c'est pourquoi on lui affecte cet handle comme sortie. Mais je t'accorde que ça peut être difficile de s'y retouver par moment. Je m'y suis moi même repris à deux fois avant d'écrire ce message. Autre chose: quand je faisait un CreatePipe, je spécifiais aussi le troisième argument (SECURITY_ATTRIBUTES sa = {sizeof sa, NULL, 1};) Je sais pas si c'est obligatoire... Pour être clair: le ReadFile doit se faire sur le premier param, et l'autre processus doit écrire dans le deuxième (après tu appelles tes HANDLEs comme tu le souhaites). _____________________________________ Un éditeur de ressources gratuit pour Windows
|
|
Cette discussion est classée dans : buffer, sortie, hfile, pi, dwreaded
Répondre à ce message
Sujets en rapport avec ce message
Avis des PROS! [ par UnExPeCtEdSpy ]
Bonjour,je suis plus familier du vb que du c++ alors j'vous d'mande de l'aide :J'utilise une Dll en c+ avec un prog en Vb qui manipule des fichiers.Qu
prgramme qui plante lors de Lecture de fichier [ par samki ]
Bonjourj utilise la fonction suivante pour lire des fichiers:CString GenerateHTML::bReadFileHTML(CString FileName){ DWORD dwWritten; CString PathTempl
CreatePorcess + App 16-bits [ par vecchio56 ]
BonjourJ'éxécute une application 16-bits avec CreateProcess mais je n'arrive pas à récupérer ce qu'il y a dans stdout. Le problème c'est que le même c
Comparer une ligne d'un fichier avec la précédente [ par boudafc ]
Voilà, j'ai un fichier où toutes les lignes sont en double.Ce que je voulais faire, c'est comparer une ligne par rapport à la précédente, mais voilà,
Pipes sous windows [ par ssmint ]
Bonjour à tous, Voilà je voudrais piloter CMD.EXE gràce à mon prog pour au final pouvoir réaliser une sorte de telnet...J'ai redirigé l'entrée et la s
UpdateResource() ICON [ par maladedede ]
BonjourJ'ai deja utiliser plusoeur fois Update resource pour changer des resources du type RCDATA d'un ".exe"Et la c'est la resourc ICON du ".exe" que
Problemes pour formatter le nom de mes fichiers a ouvrir [ par pif56 ]
Bonjour,Voila j aimerais pouvoir, au sein d une boucle while, ouvrir une famillede fichiers textes appeles "i.txt" oú i est un entier parcourant [0,4]
Récupération "au fil de l'eau" du résulat d'une commande DOS [ par 10MilleSabords ]
Bonjour,Tout est dans le sujet. Est-ce possible?Voici ou j'en suis:Je lance ma ligne de commande par un CreateProcess puis je récupère le résulat dans
(win32)Fichier et buffer en lecture seule [ par mogwai93 ]
Bonjour Je voudrais lire un fichier, placer le contenu de ce fichier dans un buffer et modifier ce buffer (mais pas le fichier). J'arrive bien à ou
CreateProcess et processus infini [ par Rankin ]
Salut à tous,Je suis en train de développer une appli qui lance pas mal de commandes système pour récupérer notamment la configuration du réseau. Pour
Livres en rapport
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|