Faire écrier qch a mon Prog derriere la CMD

Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006 - 21 févr. 2006 à 17:47
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006 - 24 févr. 2006 à 15:48
Salut,
je suis en train d'ecrire un programme en C++, il ouvre une CMD avec CreateProcess, imaintenant je voudrai qu'il écrive qch derière la CMD. Dans mon exemple "dir".

Mais cela ne marche pas, la CMD fonctione elle en soit, si j'y inscrit manuellement qch il n'y a pas de probleme, mais je ne parviens pas a faire écrire qch au programme.

Quelqu'un peut il m'aider? Ca fait plussiers semaines que je suis bloqué a cuase de ce Pprobleme, je ne trouve pas la faute... Je serai content si qu'un avait un tuyau.

Salutations,
Sens0r
HANDLE hIn;
hIn = GetStdHandle(STD_INPUT_HANDLE);        
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);

        if (hIn != INVALID_HANDLE_VALUE)
        {
            bool y=TRUE;
            AllocConsole();
            STARTUPINFO si = { sizeof(si) };
            si.dwFlags = STARTF_USESTDHANDLES;
            si.hStdInput = hIn;
            si.hStdOutput = hOut;
           

            PROCESS_INFORMATION  pi;
            char                 szExe[] = "cmd.exe";
            while (y){
                if(CreateProcess(0, szExe, 0, 0, TRUE, 0, 0, 0, &si, &pi))
                    {
                    for(;;)
                        {
                  
                       
                        const char *dir= "dir\r\n";
                            DWORD written = 0;
                        WriteFile (hIn,dir,strlen(dir),&written,NULL);      
                        }
                    }
                }
            }

16 réponses

KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
21 févr. 2006 à 20:53
Salut, si tout simplement tu ecris sur la sortie standard cela ne marche pas ?? genre printf ou std::cout ?

Sinon il existe une/des fonction(s) pour simuler l'appui et le relachement de touche clavier mais je ne me souvient plus de leur nom....

KeniiyK
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 21:00
Comme le fait judicieusement remarquer KeniiyK, tu t'es trompé de
descripteur. de la même manière que que écris sur stdout, tu doit
écrire sur hOut et pas hIn.



WriteFile (hIn,dir,strlen(dir),&written,NULL);

par

WriteFile (hOut,dir,strlen(dir),&written,NULL);





Sinon,

La commande CMD accepte l'option "/K ligne_de_commande" :


tu remplaces :


char szExe[] = "cmd.exe";


par


char szExe[] = "cmd.exe /K dir\r\n";
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 21:03
Excellent!
Merci ler gars ;)

j'essaie et je vous dir si ca marche, dans tout les cat, big thx

Sens0r
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 21:29
Ok, j'ai testé.

Mais j'ai encore certains problemes...

Tout d'abord doit-je laisser WriteFile (hOut,dir,strlen(dir),&written,NULL); dans le handle hIn? Oubien le placer dans le hOut?

Si je le laisse dans le Handle hInil m'affice "dir" mais ne l'execute pas, est-ce que quelqu'un sait pourquoi?

De plus:
char szExe[] = "cmd.exe /K dir\r\n";
ne marche pas, mais cela n'importe guere car dans mon projet sela ne marcherai pas, car j'utilise un buffer car il s'agit du'un projet utilisant des sockets...

Je suis très content de votre aide, j'espère pouvoir compter sur vous encore un peu...
;)
Sens0r
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 21:45
Ca ne marche pas ? fait moi un copier coller de ca stp



#include "stdafx.h"

#include <windows.h>



int main(int argc, char* argv[]) {



HANDLE hIn;

hIn = GetStdHandle(STD_INPUT_HANDLE);

HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);



if (hIn != INVALID_HANDLE_VALUE) {



bool y=TRUE;

AllocConsole();

STARTUPINFO si = { sizeof(si) };

si.dwFlags = STARTF_USESTDHANDLES;

si.hStdInput = hIn;

si.hStdOutput = hOut;





PROCESS_INFORMATION pi;

char szExe[] = "cmd.exe /K dir\r\n";

if(CreateProcess( 0, szExe, 0, 0, TRUE, 0, 0, 0, &si, &pi)) { }

}

return 0;

}
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 21:48
d'autre part ton programme tourne en rond la variable de boucle n'est jamais mis à jour !!

Relis toi avant de poser des questions et d'affirmer des trucs !!!
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 21:56
Mh... tu as raison ton programme marche... mh alors il y a un probleme quelquepart d'autre...

Je ne voulais surtout pas te vexer lorsque j'ai dir que cela ne marchait pas, je voulais en fait dire que cela ne marchait pas pour mon prog...

Mh mais si j'ai un Buffer je ne peux pas le mettre comme tu as mis "dir" oubien?
Que me propose tu la?

Je te remercie beaucoup!

Sens0r
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 21:59
desolé si je me suis mal exprimé... je voulait vraiment pas te vexer, ni affirmer que c'etait faux...

cela est peut etre lié au fait que le francais n'est pas ma langue maternelle...

excuse stp

Merci beaucoup
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 22:03
Tout d'abord doit-je laisser WriteFile
(hOut,dir,strlen(dir),&written,NULL); dans le handle hIn? Oubien le
placer dans le hOut?



Je ne comprend pas ta question...

Je comprend "placer un descripteur dans un autre"..pas possible

peux tu préciser ?
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 22:03
La boucle sans fin a un but de plus dans mon programme mais cela tu ne pouvais pas le savoir...

en fait les comandes sont envoyées du server au client, et la boucle sans fin me perme d'écrire une comande après l'autre.

Ou n'est pas une bonne idée?
Je te prie de mexcuser mais je ne m'y connais pas encore trop en programmation mais j'essaie d'apprendre

Sene0r
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 22:05
Mh alors dans mon prog j'ai un handle In et un handle Out et un handle Error, je pensais que peut être je devais mettre la commande WriteFile dans le Handle Out... mais telle ne semble pas être le cas... :)

Bon voila une question en mois, merci

Sens0r
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 22:16
Quand tu as créer ton process, tu as demandé l'héritage des handles héritables:



CreateProcess(0, szExe, 0, 0, TRUE, 0, 0, 0, &si, &pi);



BOOL CreateProcess(
  

LPCTSTR lpApplicationName,
                         // pointer to name of executable module


  LPTSTR lpCommandLine,  // pointer to command line string
  LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes


  LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes


  BOOL bInheritHandles,  // handle inheritance flag


  DWORD dwCreationFlags, // creation flags


  LPVOID lpEnvironment,  // pointer to new environment block


  LPCTSTR lpCurrentDirectory,   // pointer to current directory name
  LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO
  LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION
);





Ton process dispose alors des mêmes accès que le process parent aux entrées/sorties standard (la même console).



Ca repond a ta question ?
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 22:24
Oui je n'en doute pas, mais je ne comprend pas tout a fait... désolé...

Oui il est censé utiliser la meme console. Ca veux dire quoi en fait? Pour le moment j'ai un Handle IN et un Out, est-ce? Faux?

désolé mais je ne parviens plus a suivre la...

Tu pourais m'expliquer un peu plus clairement s'il te plait?

Merci pour le travail jusqu'ici,

Sens0r
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
21 févr. 2006 à 22:24
Mh mais si j'ai un Buffer je ne peux pas le mettre comme tu as mis "dir" ?



C'est un buffer de quoi ? char, int, autre chose ?

Tu veux faire quoi de ce buffer ? l'envoyer sur la console ?
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
21 févr. 2006 à 22:53
Oui c'est un Buffer char de 1024 bytes.

En fait je voudrais qu'il apparaisse sur la console... tout come le fait ton Prog avec "dir" seul différence ca devrait être le contenue de mon Buffer.

Merci
Sens0r
0
Sens0r Messages postés 35 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 23 mars 2006
24 févr. 2006 à 15:48
Personne?

Aidez moi svp
0
Rejoignez-nous