PDA

Ver la Versión Completa : leer datos desde un ms-dos


odiseeus
01-11-2011, 19:02:44
buen dia, he notado que un programa en ms-dos se puede ingresar y leer datos a partir de otro programa ms-dos o de modo visual (builder), me explico mejor... si tengo un programa que se muestra en ms-dos llamado "ejemplo.exe" y que lo que hace en pantalla como tal es pedir un dato y despues de ingresado a continuacion muestra solamente el resultado de ciertos procedimientos en la pantalla del ms-dos, por lo tanto lo unico visible seria dos lineas, una con el dato ingresado y otra con el resultado, ahora quiero saber como seria la sintaxis en c++ para desde otro programa (sea ms-dos o de modo visual(builder)) pueda utilzar el programa "ejemplo.exe" ingresandole el dato y leer el resultado, sin necesidad de ejecutar el programa (ejemplo.exe) como tal por un usuario, pues serviria para hacer un ejecutable que me evaluara muchos ejecutables al menor tiempo... espero haberme hecho entender!.. saludos y gracias!

_cero_
01-11-2011, 19:34:09
Para mandar un dato es tan simple como escribirlo como parámetro, ejem. “C:\miexe.exe midato”, en este caso le estoy pasando la cadena “midato” al ejecutable “miexe.exe”. Ahora para recibir datos se pone un poco más complicada la cosa, hay muchos métodos, que sirven para comunicarse entre aplicaciones, serian mediante mensajes de Windows, espacios de memoria compartida, tuberías, inyección de código (todos estos métodos sirven en dos vías, es decir sirven para recibir y mandar datos), y seguro que se me está pasando uno que otro método.

Yo te recomendaría que pasaras mensajes, en mi opinión es la manera más simple de comunicación entre aplicaciones, y es tan fácil como enviarlos con el API SendMessage (http://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx), y monitorearlos desde la otra (esto dependerá de cómo está desarrollada la otra, pero podrias usar PeekMessage (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943%28v=vs.85%29.aspx)), en cualquier caso te dejo algo sobre esto aunque en código delphi, se puede traducir a c++ con cierta facilidad.

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=480

escafandra
01-11-2011, 21:07:01
La única pega que se le puede poner al sistema de mensajes, es que estemos tratando con aplicaciones de consola no hechas por nosotros. En ese caso lo mejor son las tuberías.

Este ejemplo de código ejecuta un comando de consola o una aplicación capturando su salida en modo texto. El resto es analizar dicha salida para obtener lo que interese en cada caso:

String DosCommand(String CommandLine)
{
char Buffer[4096];
GetEnvironmentVariable("COMSPEC", Buffer, sizeof(Buffer));
CommandLine = String(Buffer) + " /C " + CommandLine;
String Result = "";

HANDLE pipeRead, pipeWrite;
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES)};
sa.bInheritHandle = TRUE;

if(CreatePipe(&pipeRead, &pipeWrite, &sa, 2500000)){
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi = {0};
si.hStdOutput = si.hStdError = pipeWrite;
si.hStdInput = pipeWrite;//GetStdHandle(STD_INPUT_HANDLE);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if(CreateProcess(0, CommandLine.c_str(), 0, 0, TRUE, 0, 0, 0, &si, &pi)){
CloseHandle(pi.hThread);
if(WaitForSingleObject(pi.hProcess, 9000) == WAIT_OBJECT_0){
DWORD dwRead = 0;
WriteFile(pipeWrite, "", 1, &dwRead, 0);
do{
memset(Buffer, 0, sizeof(Buffer));
ReadFile(pipeRead, Buffer, sizeof(Buffer), &dwRead, 0);
OemToCharBuffA(Buffer, Buffer, dwRead);
Result = Result + "\r\n" + String(Buffer);
} while (dwRead >= sizeof(Buffer));
}

CloseHandle(pi.hProcess);
}
CloseHandle(pipeRead);
CloseHandle(pipeWrite);
}

return Result;
}



Saludos.

Toni
07-11-2011, 17:09:31
Escafranda, es muy interesante esto que publicas. Es algo que tenia en mente para hacer, y que tiene mucha utilidad. Gracias por compartirlo. :)