He programado una shell en C para Win, que me permite ejecutar comandos. Para ello utilizo las 2 siguientes funciones:
Código
char* ReadAndHandleOutput(HANDLE hPipeRead) { char lpBuffer[256]=""; DWORD nBytesRead; char *partialResult; char result[10000]=""; while(1) { if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead) { if (GetLastError() == ERROR_BROKEN_PIPE) break; // pipe done - normal exit path. } } return result; } char* executeCommand(char *argument) { SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; void * leer; void * escribir; ZeroMemory(&sa,sizeof(&sa)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; CreatePipe(&leer,&escribir,&sa,0); GetStartupInfoA(&si); si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = escribir; si.hStdError = escribir; si.hStdInput = leer; CreateProcess(0,argument,0,0,TRUE,0,NULL,NULL,&si,&pi); CloseHandle(escribir); return ReadAndHandleOutput(leer); }
La shell me funciona perfectamente en Windows Vista y 7 (tanto en 32 como en 64bits), pero en XP (32bits) el programa se me queda pillado en la siguiente instrucción:
Código
if (!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nBytesRead,NULL) || !nBytesRead)
No consigo dar con el error por el que en XP se queda pillado en ese punto del código, porque el programa no se para, sigue funcionando sin hacer nada...
Por si les sirve el dato, he probado a escribir en un fichero un dato justo antes del IF ese que da el problema y despues, y el fichero lo deja pillado, porque no llega a la instruccion de cierre (logicamente).
La lectura la hago sincrona, poniendo la ultima variable de la llamada a ReadFile a NULL, asi que no veo donde puede estar el problema :/
Cualquier ayuda se la agradezco, que ando perdiendo mucho tiempo con esto
saludoss