c++ - todas - ¿Cómo llamar a un programa externo con parámetros?
tipos de parametros en c++ (4)
Me gustaría llamar a un programa de Windows dentro de mi código con parámetros determinados dentro del código mismo.
No estoy buscando llamar a una función o método externo, sino a un archivo .exe o lote / script real dentro del entorno de WinXP.
C o C ++ sería el idioma preferido, pero si esto se hace más fácilmente en cualquier otro idioma, hágamelo saber (ASM, C #, Python, etc.).
Creo que está buscando la función CreateProcess en la API de Windows. En realidad, hay una familia de llamadas relacionadas, pero esto lo ayudará a comenzar. Es bastante fácil.
Cuando llame a CreateProcess (), System (), etc., asegúrese de citar dos veces las cadenas de nombre de archivo (incluido el nombre de archivo del programa de comando) en caso de que los nombres de los archivos y / o la ruta completa tengan espacios; de lo contrario, las partes de la ruta del nombre del archivo será interpretada por el intérprete de comandos como argumentos separados.
system("/"d:some path//program.exe/" /"d://other path//file name.ext/"");
Para Windows, se recomienda utilizar CreateProcess (). Tiene una configuración más desordenada, pero usted tiene más control sobre cómo se inician los procesos (como lo describe Greg Hewgill). Para rápido y sucio, también puedes usar WinExec (). (el sistema () es portátil para UNIX).
Al iniciar archivos por lotes, es posible que deba iniciarse con cmd.exe (o command.com).
WinExec("cmd /"d:some path//program.bat/" /"d://other path//file name.ext/"",SW_SHOW_MINIMIZED);
(o SW_SHOW_NORMAL
si desea que se muestre la ventana de comandos).
Windows debería encontrar command.com o cmd.exe en la RUTA del sistema, por lo que no debería necesitar una calificación completa, pero si quiere estar seguro, puede componer el nombre de archivo CSIDL_SYSTEM
con CSIDL_SYSTEM
(no use simplemente C: / Windows / system32 / cmd.exe).
Ejemplo de C ++:
char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);
C # ejemplo:
private static void RunCommandExample()
{
// Don''t forget using System.Diagnostics
Process myProcess = new Process();
try
{
myProcess.StartInfo.FileName = "executabletorun.exe";
//Do not receive an event when the process exits.
myProcess.EnableRaisingEvents = false;
// Parameters
myProcess.StartInfo.Arguments = "/user testuser /otherparam ok";
// Modify the following to hide / show the window
myProcess.StartInfo.CreateNoWindow = false;
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
myProcess.Start();
}
catch (Exception e)
{
// Handle error here
}
}
Una de las formas más sencillas de hacerlo es utilizar la función de biblioteca de tiempo de ejecución de system()
. Toma una sola cadena como parámetro (¡muchos menos parámetros que CreateProcess
!) Y la ejecuta como si estuviera escrita en la línea de comando. system()
también espera automáticamente que el proceso finalice antes de que regrese.
También hay limitaciones:
- usted tiene menos control sobre stdin y stdout del proceso lanzado
- no puede hacer nada más mientras el otro proceso se está ejecutando (como decidir matarlo)
- no se puede manejar el otro proceso para consultarlo de ninguna manera
La biblioteca de tiempo de ejecución también proporciona una familia de funciones exec*
( execl
, execlp
, execle
, execv
, execvp
, más o menos) que se derivan del patrimonio de Unix y ofrecen más control sobre el proceso.
En el nivel más bajo, en Win32 todos los procesos son lanzados por la función CreateProcess
, que le da la mayor flexibilidad.