Existen dos formas de abrir un programa utilizando C++.
| 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. |
Utilizando system
El comando system se encuentra en la librería estándar stdlib.h por lo que funciona en cualquier sistema operativo que tenga un compilador de C/C++ como por ejemplo Linux, Windows, etc.
Este comando recibe como parámetro una cadena de caracteres que indica la instrucción que se desea procesar. Dicha instrucción es pasada al intérprete de comandos del ambiente en el que se esté trabajando y se ejecuta. Ten en cuenta que el intérprete de comandos realiza todo el trabajo, por lo que si tu ambiente de trabajo no cuenta con uno este comando no funcionará. Por defecto Windows viene con Command Prompt y Linux con el Terminal.
En lugar de perder más tiempo hablando de como funciona les voy a mostrar algunos ejemplos de lo que se puede hacer con el comando system. Acuérdense de que esto depende del ambiente por lo que voy a poner algunos ejemplos para Linux y otros para Windows.
| S.O. | Comando | Descripción |
|---|---|---|
| Windows |
system("notepad.exe");
|
Abre el programa Notepad.Esto solo funciona porque notepad.exe se encuentra dentro del PATH de Windows. |
| Linux |
system("gedit");
|
Abre el programa gedit. |
| Windows |
system("C:\\Copstone\\tablas.exe");
|
Abre el programa tablas.exe ubicado en la ruta C:\\Copstone. |
| Linux |
system("/home/copstone/tablas");
|
Abre el programa tablas ubicado en la ruta /home/copstone |
| Windows |
system("notepad.exe C:\\prueba.txt");
|
Abre el programa Notepad y carga el archivo prueba.txt ubicado en el disco C |
| Windows |
system("C:\\prueba.txt");
|
Muy parecido al programa anterior pero deja que el sistema operativo decida con que programa abrir el documento de texto. |
En términos generales, cualquier instrucción que se pueda realizar desde la línea de comandos se puede realizar desde un programa en C++ utilizando el comando system.
Prueba creando directorios, eliminando y copiando archivos, mostrando una lista de los directorios, cambiando nombre a archivos etc.
Desventajas de system al momento de abrir aplicaciones externas
Nuestro programa se queda esperando.- Cuando utilizamos el comando system, nuestro programa se queda esperando hasta que se termine de ejecutar el comando solicitado. En el caso de que solicitemos abrir otra aplicación, nuestro programa deberá esperar hasta que la aplicación se cierre.
Ejemplo:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Se esta por abrir notepad\n");
system("notepad.exe");
printf("Se termino de ejecutar notepad\n");
return 0;
}
En el ejemplo anterior el mensaje “Se esta por abrir notepad” se muestra justo antes de que se ejecute la aplicación Notepad, sin embargo el segundo mensaje “Se termino de ejecutar notepad” se mostrará recién cuando cerremos el notepad.
En entorno visual aparece la ventana del intérprete de comandos.- Cuando ejecutamos este comando en una aplicación en entorno visual, vemos una pantalla con el intérprete de comandos que puede ser molesta para el usuario.
Utilizando ShellExecute
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:
HINSTANCE ShellExecute(HWND, LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR, INT);
Donde los parámetros son los siguientes:
| # | Tipo | Descripció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
ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), NULL, NULL, SW_SHOWNORMAL);
Abrir notepad con un archivo de texto
ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), TEXT("C:\\prueba.txt"), NULL, SW_SHOWNORMAL);
Abrir un archivo de texto con el editor predefinido
ShellExecute(NULL, TEXT("open"), TEXT("C:\\prueba.txt"), NULL, NULL, SW_SHOWNORMAL);
Abrir un programa externo
ShellExecute(NULL, TEXT("open"), TEXT("C:\\Copstone\\tablas.exe"), NULL, NULL, SW_SHOWNORMAL);
Abrir un programa externo y que comience maximizado
ShellExecute(NULL, TEXT("open"), TEXT("C:\\Copstone\\tablas.exe"), NULL, NULL, SW_MAXIMIZE);
Abrir un programa externo y que permanezca oculto
ShellExecute(NULL, TEXT("open"), TEXT("C:\\Copstone\\tablas.exe"), NULL, NULL, SW_HIDE);
Como el programa está oculto parece que esto no funciona, pero si entras al administrador de tareas puedes ver que tu proceso tablas.exe está corriendo.
Abrir una página web
ShellExecute(NULL, TEXT("open"), TEXT("http://copstone.com"), NULL, NULL, SW_SHOWNORMAL);
Abrir un directorio
ShellExecute(NULL, TEXT("open"), TEXT("C:\\Copstone\\"), NULL, NULL, SW_SHOWNORMAL);
Abrir un directorio mostrando las jerarquía de carpetas
ShellExecute(NULL, TEXT("explore"), TEXT("C:\\Copstone\\"), NULL, NULL, SW_SHOWNORMAL);
Imprimir un documento de texto
ShellExecute(NULL, TEXT("print"), TEXT("C:\\Copstone\\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:
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.
En resumen
Son muchas las cosas que se pueden hacer con los comandos system y ShellExecute, te recomiendo que pruebes las diferentes combinaciones para que veas todo lo que se puede hacer.
Artículos similares
Autor: Alfredo Granda
Se que tengo que hablar de mi, pero no se por donde comenzar. Empezare diciendo que me llamo Alfredo, y si de colores me hablas, el verde es el que prefiero. Una gaseosa es infaltable y aunque intenté dejarlo, debo de confesar que me duro poco el no fumar. Si me hablas de software, te dire que "Sólo C que programando C++", pero también convivo sin problemas con PHP y C#. En mis ratos libres me dedico a programar y si me preguntas algo más tengo una esposa que adoro y que nunca voy a dejar.

Deja un comentario