2010-06-08 16 views
5

Tengo esta aplicación de consola de Windows que toma un archivo, hace algunos cálculos y luego escribe la salida en un archivo especificado. La entrada se especifica en el formato "app.exe -input fullfilename". Necesito llamar a esta aplicación desde mi programa C++, pero tengo un problema con los espacios en las rutas a los archivos. Cuando llamo a la aplicación directamente desde cmd.exe escribiendo (sin especificar el archivo de salida para mayor claridad)Cómo pasar parámetros con espacios a través del sistema cstdlib

"c:\first path\app.exe" -input "c:\second path\input.file" 

todo funciona como se esperaba. Sin embargo, cuando intento usando cstdlib std :: sistema de la función(), es decir

std::system(" \"c:\\first path\\app.exe\" -input \"c:\\second path\\input.file\" "); 

las impresiones de la consola que c: \ primero no es ningún comando válido. Probablemente sea un error común y tenga una solución simple, pero no he podido encontrar ninguno. Thx por cualquier ayuda.

+0

¿Has probado a escapar de los espacios también? – Troubadour

+0

En sistemas UNIX, esta es la responsabilidad del shell, y debería funcionar. No estoy seguro de quién tiene esa responsabilidad en Windows, pero apuesto a que hace una diferencia si estás usando MSVC++ o MinGW o Cygwin. ¿Podría decirnos qué compilador está utilizando? –

+0

Parece que esto funciona, pero no estoy seguro de por qué: 'std :: system (" \ "\" c: \\ first path \\ app.exe \ "-input \" c: \\ second path \\ input.file \ "\" ");' – Naveen

Respuesta

0

No intente poner las comillas en la llamada std :: system(). Pruebe lo siguiente:

std::system("c:\\first\\ path\\app.exe -input c:\\second\\ path\\input.file"); 
1

En lugar de std :: system(), se debe utilizar la función _wspawnv de la API de Windows. Use _wspawnvp si desea buscar el programa en PATH, en lugar de especificar una ruta completa a él.

 
#include <stdio.h> 
#include <wchar.h> 
... 
const WCHAR *app = L"C:\\path to\\first app.exe"; 
const WCHAR *argv[] = {app, L"-input", L"c:\\second path\\input file.txt"}; 
_wpspawnv(_P_WAIT, app, argv); 

También es posible usar _spawnv/_spawnvp si está 100% seguro de que el nombre del archivo de entrada nunca, nunca contener otra cosa que ASCII.

Cuestiones relacionadas