Frecuentemente cuando programamos necesitamos ejecutar un programa externo (desde un PDF con el manual de instrucciones, hasta alguna aplicación externa de Windows).

En este artículo veremos cómo abrir una aplicación o archivo exrterno desde C++ en Linux y Windows.

 

 

 

 

 

 


Este artículo originalmente se encuentra en copstone, el cual me fue de enorme utilidad a la hora de programar un proyecto personal.

En C la forma clásica (también compatible en C++) es emplear el comando system, pero para Windows también existe otro comando llamado ShellExecute.

system Permite ejecutar cualquier instrucción que sea interpretada por una línea de comandos.
ShellExecute Permite abrir archivos, carpetas y ejecutar programas en Windows.

A continuación veremos cómo utilizar cada uno de ellos.

 

Empleando system

El comando system se encuentra en la librería estándar stdlib.h por lo que funciona (como dijimos al comienzo) en cualquier sistema operativo que sea capaz de compilar C/C++.

Este comando recibe como único parámetro una cadena de caracteres que indica la instrucción que se desea introducir en en el intérprete de comandos (Terminal, cmd, etc).
Debe tenerse en cuenta que el argumento (parámetro) que es enviado en la función es exactamente el que recibirá el intérprete del Sistema Operativo que se esté utilizando, por lo que si ese comando no existe, simplemente no funcionará.

A continuación voy a dejar una tabla que tomé prestada de copstone, que me parece muy bien resumida:

S.O.ComandoDescripción
Windows
1 system("notepad.exe");
Abre el programa Notepad.Esto solo funciona porque notepad.exe se encuentra dentro del PATH de Windows.
Linux
1 system("gedit");
Abre el programa gedit.
Windows
1 system("C:\\Binarios\\tablas.exe");
Abre el programa tablas.exe ubicado en la ruta C:\\Copstone.
Linux
1 system("/home/Binarios/tablas");
Abre el programa tablas ubicado en la ruta /home/copstone
Windows
1 system("notepad.exe C:\\prueba.txt");
Abre el programa Notepad y carga el archivo prueba.txt ubicado en el disco C
Windows
1 system("C:\\prueba.txt");
Muy parecido al programa anterior pero deja que el sistema operativo decida con que programa abrir el documento de texto.

Este comando posee una clara desventaja (o característica a tener en cuenta): Toda la aplicación quedará esperando hasta que se haya finalizado la ejecución del system.

Ejemplo:

1 #include <stdio.h>
2 #include <stdlib.h>
3 int main()
4 {
5 printf("Se esta por abrir notepad\n");
6 system("notepad.exe");
7 printf("Se termino de ejecutar notepad\n");
8 return 0;
9 }

 

 

Utilizando ShellExecute (sólo Windows)

El comando ShellExecute funciona solamente en Windows y necesita la libreía windows.h. Este comando permite obviar las desventajas del comando system. La sintáxis del comando es la siguiente:

1 HINSTANCE ShellExecute(HWND, LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR, INT);

Donde los parámetros son los siguientes:

#TipoDescripción
1 HWND La aplicación que tiene el control. Este parámetro no es indispensable y por lo general si pasamos NULL es suficiente.
2 LPCTSTR Una cadena de texto que indica el tipo de comando a procesar. Puede ser: edit, open, explore, find, print y NULL.Para convertir una cadena de texto a LPCTSTR podemos utilizar la función TEXT
3 LPCTSTR Una cadena de texto con la ruta completa del archivo o carpeta a procesar.Para convertir una cadena de texto a LPCTSTR podemos utilizar la función TEXT
4 LPCTSTR Una cadena de texto con los parámetros a enviar a la aplicación. Si no existen parámetros se puede mandar NULL.Para convertir una cadena de texto a LPCTSTR podemos utilizar la función TEXT
5 LPCTSTR Una cadena de texto con la ruta del directorio que se utilizará como base al momento de ejecutar el comando. Este parámetro por lo general es NULL.Para convertir una cadena de texto a LPCTSTR podemos utilizar la función TEXT
6 INT Un entero que indica como se desea mostrar la aplicación. Se recomienda utilizar las constantes predefinidas siendo las más comunes las siguientes:SW_SHOWNORMAL, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED y SW_HIDE

Para mayor información acerca de los parámetros y lo que hace cada uno de ellos visita http://msdn.microsoft.com/en-us/library/bb762153%28VS.85%29.aspx

Suficiente teoría, ahora vamos a la práctica con unos cuantos ejemplos:

Abrir notepad

1 ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), NULL, NULL, SW_SHOWNORMAL);

Abrir notepad con un archivo de texto

1 ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), TEXT("C:\\prueba.txt"), NULL, SW_SHOWNORMAL);

Abrir un archivo de texto con el editor predefinido

1 ShellExecute(NULL, TEXT("open"), TEXT("C:\\prueba.txt"), NULL, NULL, SW_SHOWNORMAL);

Abrir un programa externo

1 ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\tablas.exe"), NULL, NULL, SW_SHOWNORMAL);

Abrir un programa externo y que comience maximizado

1 ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\tablas.exe"), NULL, NULL, SW_MAXIMIZE);

Abrir un programa externo y que permanezca oculto

1 ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\tablas.exe"), NULL, NULL, SW_HIDE);

Como el programa está oculto parece que esto no funciona, pero si entras al administrador de tareas verás que el proceso tablas.exe está corriendo.

Abrir una página web

1 ShellExecute(NULL, TEXT("open"), TEXT("http://binari-os.com.ar"), NULL, NULL, SW_SHOWNORMAL);

Abrir un directorio

1 ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\"), NULL, NULL, SW_SHOWNORMAL);

Abrir un directorio mostrando las jerarquía de carpetas

1 ShellExecute(NULL, TEXT("explore"), TEXT("C:\\Binarios\\"), NULL, NULL, SW_SHOWNORMAL);

Imprimir un documento de texto

1 ShellExecute(NULL, TEXT("print"), TEXT("C:\\Binarios\\prueba.txt"), NULL, NULL, SW_SHOWNORMAL);

 

NOTA: Si estás tratando de utilizar ShellExecute en Visual Studio C++ para una aplicación de entorno visual, es probable que te aparezca un error de compilación como el siguiente:

1 unresolved external symbol "extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW

Para solucionar este problema basta que vayas a la opción del menú Project –> Properties –> Configuration Properties –> Linker –> Input y agrega shell32.lib en la parte de Additional Dependencies.

Referencias:

 

 


 

Licencia . Ver información de licencia & cómo copiar material de esta web aquí.  - Autor artículo original: Alfredo Granda.