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 me simplifier la vie, j'ai écrit une fonction qui exécute une commande et retourne (ou non) le résultat de celle-ci en passant par un pipe. Cette fonction semblait marcher à merveille, mais j'ai un problème à l'exécution de la commande ipconfig /all : d'ordinaire j'attends que le programme que je lance soit terminé avant d'en récupérer le résultat, mais cette commande ne se termine jamais et je la tue au bout de 5 secondes (je remplace le INFINITE par 5000). C'est très laid et j'aimerais donc savoir si il y a quelque chose dans cette fonction qui n'est pas propre comme il faut.
D'autre part, le résultat n'est pas complet : avec 9 interfaces réseau, les deux dernières ne sont pas affichées.
En voici le code, avec les include et un main, y'a plus qu'à compiler pour tester :
#include <windows.h>
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
string commandLine(string command, bool hide, bool encode)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE hPipeOutput, hPipeInput;
DWORD dwRead;
unsigned short size = 4096;
char buffer[size+1];
memset(buffer,0,sizeof(buffer));
string res = "";
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = 0;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
//si.wShowWindow = SW_HIDE;
ZeroMemory(&pi, sizeof(pi));
if(!hide && CreatePipe(&hPipeOutput, &hPipeInput, &sa, 0))
si.hStdOutput = hPipeInput;
else
//Au cas où la création du pipe ait échoué, on ne lira pas dedans
hide = true;
if(CreateProcess(0, (char*)command.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW/*|DETACHED_PROCESS*/, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeProcess(pi.hProcess, &dwExitCode);
//Si processus toujours présent, on le tue
if(dwExitCode == STILL_ACTIVE)
{
TerminateProcess(pi.hProcess, 0);
}
if (!hide)
{
bool end = false;
while (!end)
{
if (GetFileSize (hPipeOutput, NULL) >0 && ReadFile(hPipeOutput, buffer, size, &dwRead, NULL))
{
if (encode)
CharToOem(buffer,buffer);
res += buffer;
memset(buffer,0,sizeof(buffer));
}
else
end = true;
}
}
}
if(hPipeInput)
CloseHandle(hPipeInput);
if(hPipeOutput)
CloseHandle(hPipeOutput);
return res;
}
int main()
{
cout<<commandLine("ipconfig /all",false,true)<<endl;
return 0;
}
N'hésitez pas à me faire part de vos critiques, même si ce n'est pas de là que vient l'erreur ! C'est toujours bon d'avoir l'avis d'autres personnes pour progresser...
Merci à vous !