2009-01-28 23 views
22

Me gustaría llamar a un programa de Windows dentro de mi código con parámetros determinados dentro del código mismo.¿Cómo llamar a un programa externo con parámetros?

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.).

Respuesta

23

Cuando se llama a CreateProcess(), Sistema(), etc., asegúrese de dobles comillas sus cadenas de nombre de archivo (incluida la nombre de archivo del programa de comando) en caso de que los nombres de los archivos y/o la ruta totalmente calificada tengan espacios, de lo contrario las partes de la ruta del nombre del archivo serán analizadas 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 iniciar 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 la ventana de comando que se muestra).

Windows debería encontrar command.com o cmd.exe en el sistema PATH, por lo que no debería necesitar una cualificación completa, pero si quiere estar seguro de que puede componer el nombre de archivo completo con CSIDL_SYSTEM (no simplemente use C: \ Windows \ system32 \ cmd.exe).

+1

Estos son consejos maravillosos para posibles obstáculos futuros y aclaraciones generales. Muchas gracias. – Will

8

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.

+1

Bueno, no es tan fácil como usar el sistema() pero al menos existe una solución. Gracias por la sugerencia y el enlace más fuertes. – Will

5

Una de las formas más sencillas de hacerlo es utilizar la función de biblioteca de tiempo de ejecución system(). Toma una única 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 a que el proceso finalice antes de que regrese.

También hay limitaciones:

  • que tiene menos control sobre la entrada y salida estándar del proceso iniciado
  • no se puede hacer otra cosa mientras que el otro proceso está en ejecución (por ejemplo, la decisión de acabar con él)
  • no se puede obtener un identificador para el otro proceso con el fin de consultar en cualquier forma

la biblioteca de ejecución también proporciona una familia de diversión exec* ctions (execl, execlp, execle, execv, execvp, más o menos) que se derivan del patrimonio de Unix y ofrecen un mayor control sobre el proceso.

En el nivel inferior, en Win32, todos los procesos se inician con la función CreateProcess, que le brinda la mayor flexibilidad.

+0

Esto es definitivamente lo que pensé que estaba buscando ... pero esas limitaciones son bastante difíciles de conseguir ... Podría hacerlo si el diseño funcionara con eso. ¡Gracias por esta información! – Will

8

C++ ejemplo:

char temp[512]; 
sprintf(temp, "command -%s -%s", parameter1, parameter2); 
system((char *)temp); 

ejemplo de C#:

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 
     } 
    } 
+0

¡Grandes ejemplos, gracias! – Will

Cuestiones relacionadas