Prog msdos

Résolu
kollibar Messages postés 45 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 31 janvier 2006 - 5 sept. 2004 à 22:40
antoine_1977 Messages postés 29 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 1 novembre 2004 - 7 sept. 2004 à 17:58
comment faut il faire pour lancer un programme MS-dos et recupperrer toutes ce que celui ci imprimme a l ecran??

merci.

KOLLIBAR bare

8 réponses

antoine_1977 Messages postés 29 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 1 novembre 2004
7 sept. 2004 à 17:58
voilà une vrai réponse après qq heures de recherches....

char * TMainForm::RunDOScmd(char *CommandLine)
{
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
unsigned long dwExitCode;

    HANDLE PipeInputRead;
    HANDLE PipeInputWrite;
    HANDLE PipeOutputRead;
    HANDLE PipeOutputWrite;

    SECURITY_ATTRIBUTES securityattribs = {
    	sizeof(SECURITY_ATTRIBUTES),
    	NULL,
    	TRUE
};

ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));

// initialisation de la taille
siStartupInfo.cb = sizeof(siStartupInfo);

    // Create pipe for standard output redirection
    CreatePipe(&PipeOutputRead, &PipeOutputWrite, &securityattribs, 0);
    // Create pipe for standard input redirection.
    CreatePipe(&PipeInputRead, &PipeInputWrite, &securityattribs, 0);

    siStartupInfo.dwFlags = STARTF_USESTDHANDLES;
siStartupInfo.hStdInput = PipeInputRead;
    siStartupInfo.hStdOutput = PipeOutputWrite;
    siStartupInfo.hStdError = PipeOutputWrite;

bool pSuccess = CreateProcess( NULL,
                                   CommandLine,
                                   NULL,
                                   NULL,
                                   true,
                                   0,
                                   NULL,
                                   NULL,
                                   &siStartupInfo,
                                   &piProcessInfo);
if (pSuccess) {
CloseHandle(piProcessInfo.hThread);  		// fermer le handle de thread dès qu'il devient inutile
WaitForSingleObject(piProcessInfo.hProcess, INFINITE); 		// attente jusqu'à la signalisation de la fermeture de notepad
GetExitCodeProcess(piProcessInfo.hProcess, &dwExitCode);  	// le processus notepad est terminé
if (dwExitCode != STILL_ACTIVE)
CloseHandle(piProcessInfo.hProcess); 	// fermer le handle de process
} else {
    	MessageBox(NULL, CommandLine, "Command Line Error", MB_OK|MB_ICONSTOP);
CloseHandle(PipeOutputWrite);
CloseHandle(PipeInputRead);
        return("");
    }
    CloseHandle(PipeOutputWrite);
  	CloseHandle(PipeInputRead);
  	CloseHandle(PipeInputWrite);

      // Read output from the child process.
  DWORD dwRead;
  CHAR chBuf[BUFSIZE];
  String procstdout="",procstderr="";
  while (ReadFile(PipeOutputRead, chBuf, BUFSIZE-1, &dwRead, NULL) && (dwRead != 0)) {
    chBuf[dwRead] = '\0';
    procstdout += chBuf;
    this->Memo1->Text= chBuf;
  }
  while (ReadFile(PipeOutputRead, chBuf, BUFSIZE-1, &dwRead, NULL) && (dwRead != 0)) {
    chBuf[dwRead] = '\0';
    procstderr += chBuf;
  }
    CloseHandle(PipeOutputRead);



Borland C++ v6.
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
5 sept. 2004 à 22:57
http://www.vbfrance.com/code.aspx?id=6395

En VB mais TRES facilement tu peux migrer cette application en C/C++.

Voila ++
0
antoine_1977 Messages postés 29 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 1 novembre 2004
5 sept. 2004 à 23:12
Super ta réponse Alex, mais VB c'est pas ce site là...
En C j'utilise la redirection '>' du dos vers un fichier puis j'exploite ce fichier... du genre

system("dir /B /S > monfichier.txt");
tu ouvre le fichier .txt et tu le parse.

Mais il y a peut-être qqchose de plus immédiat en C++ mais alors je ne le connais pas... c toi qui vois.

Borland C++ v6.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
6 sept. 2004 à 00:04
Salut,
Faut lancer l'exe avec CreateProcess, et mettre le handle de son choix dans le membre hStdOutput de la structure STARTUPINFO.
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 sept. 2004 à 00:11
Et 1 bon point pour aardman.

ciao...
BruNews, Admin CS, MVP VC++
0
antoine_1977 Messages postés 29 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 1 novembre 2004
6 sept. 2004 à 21:25
Dites, j'ai essayé la fonction CreateProcess, mais qd j'ai voulu récupérer le hStdOutput mais bizarement, ce handle est toujours à NULL. Pourquoi donc? alors que je lance simplement un batch avec un "echo xxxx"...

Borland C++ v6.
0
antoine_1977 Messages postés 29 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 1 novembre 2004
6 sept. 2004 à 23:49
en gros qu'est-ce qu'il fo mettre comme handel?

Borland C++ v6.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 sept. 2004 à 23:59
Va voir CreatePipe() dans MSDN, tu auras en prime un exemple quasi complet.

ciao...
BruNews, Admin CS, MVP VC++
0
Rejoignez-nous