Ejecutar un programa externo desde Visual c++ 2012 con system o ShellExecute

La manera más fácil es añadiendo el using namespace System::Diagnostics;

y luego usar Process::Start("nombredelprograma.exe");

también se puede poner la ruta absoluta pero con dobles \\ e incluso añadir qué archivo abrir.

Process::Start("notepad.exe","miarchivo.txt");

Otras maneras

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.

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

A continuación veremos cómo utilizar cada uno de ellos.
Se recomienda incluir los includes:

#include <process.h>
#include <Windows.h>

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
1system("notepad.exe");
Abre el programa Notepad.Esto solo funciona porque notepad.exe se encuentra dentro del PATH de Windows.
Linux
1system("gedit");
Abre el programa gedit.
Windows
1system("C:\\Binarios\\tablas.exe");
Abre el programa tablas.exe ubicado en la ruta C:\\Copstone.
Linux
1system("/home/Binarios/tablas");
Abre el programa tablas ubicado en la ruta /home/copstone
Windows
1system("notepad.exe C:\\prueba.txt");
Abre el programa Notepad y carga el archivo prueba.txt ubicado en el disco C
Windows
1system("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>
3intmain()
4{
5printf("Se esta por abrir notepad\n");
6system("notepad.exe");
7printf("Se termino de ejecutar notepad\n");
8return 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:
1HINSTANCE ShellExecute(HWNDLPCTSTRLPCTSTRLPCTSTRLPCTSTRINT);
Donde los parámetros son los siguientes:
#TipoDescripción
1HWNDLa aplicación que tiene el control. Este parámetro no es indispensable y por lo general si pasamos NULL es suficiente.
2LPCTSTRUna 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
3LPCTSTRUna 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
4LPCTSTRUna 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
5LPCTSTRUna 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
6INTUn entero que indica como se desea mostrar la aplicación. Se recomienda utilizar las constantes predefinidas siendo las más comunes las siguientes:SW_SHOWNORMALSW_SHOWMINIMIZEDSW_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
1ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), NULL, NULL, SW_SHOWNORMAL);
Abrir notepad con un archivo de texto
1ShellExecute(NULL, TEXT("open"), TEXT("notepad.exe"), TEXT("C:\\prueba.txt"), NULL, SW_SHOWNORMAL);
Abrir un archivo de texto con el editor predefinido
1ShellExecute(NULL, TEXT("open"), TEXT("C:\\prueba.txt"), NULL, NULL, SW_SHOWNORMAL);
Abrir un programa externo
1ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\tablas.exe"), NULL, NULL, SW_SHOWNORMAL);
Abrir un programa externo y que comience maximizado
1ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\tablas.exe"), NULL, NULL, SW_MAXIMIZE);
Abrir un programa externo y que permanezca oculto
1ShellExecute(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
1ShellExecute(NULL, TEXT("open"), TEXT("http://binari-os.com.ar"), NULL, NULL, SW_SHOWNORMAL);
Abrir un directorio
1ShellExecute(NULL, TEXT("open"), TEXT("C:\\Binarios\\"), NULL, NULL, SW_SHOWNORMAL);
Abrir un directorio mostrando las jerarquía de carpetas
1ShellExecute(NULL, TEXT("explore"), TEXT("C:\\Binarios\\"), NULL, NULL, SW_SHOWNORMAL);
Imprimir un documento de texto
1ShellExecute(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:
1unresolved 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.

No hay comentarios:

Publicar un comentario

Gracias por comentar en mi blog. Saludos.