Para poder ejecutar cualquier fichero, incluso si es una hoja de Excel, un DOC, un MP3, un AVI, etc... como si le dieses doble-click en el explorador, hay que utilizar una llamada al API de Windows ShellExecute. Veamos cómo utilizarlo.
Lo primero es declarar una Función Global que tenga la siguiente definición.
FUNCTION long ShellExecute(ulong ihwnd,string lpszOp,string lpszFile,string lpszParams,&
string lpszDir,int wShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"
Después hay que ejecutar el siguiente código. Lo mejor es que nos creemos una Función Global con la siguiente estructura, y así poder llamarla desde donde queramos.
//-------------------------------------------------------------------------
// Función : long gf_Ejecutar(String spRuta)
// Propósito : Ejecuta un fichero, sea lo que sea (doc, pdf, xls, mp3...)
// Parámetros : spRuta.- Ruta del fichero a ejecutar.
// Devuelve : 1.- Todo bien
// -1.- Hay error.
//-------------------------------------------------------------------------
Long lRetorno
String sError, sNulo
SetNull(sNulo)
// Se ejecuta la ruta pasada.
lRetorno = ShellExecute(Handle(this), sNulo, spRuta, sNulo, sNulo, 3)
//El último argumento es el estilo de la ventana:
//SW_HIDE 0
//SW_SHOWNORMAL 1
//SW_NORMAL 1
//SW_SHOWMINIMIZED 2
//SW_SHOWMAXIMIZED 3
//SW_MAXIMIZE 3
//SW_SHOWNOACTIVATE 4
//SW_SHOW 5
//SW_MINIMIZE 6
//SW_SHOWMINNOACTIVATE 7
//SW_SHOWNA 8
//SW_RESTORE 9
//SW_SHOWDEFAULT 10
//SW_MAX 10
IF lRetorno <= 32 THEN
// Hay error
CHOOSE CASE lRetorno
CASE 2
sError = "Fichero no encontrado"
CASE 3
sError = "Ruta no encontrada"
CASE 5
sError = "Acceso denegado"
CASE 8
sError = "Fuera de memoria"
CASE 32
sError = "DLL no encontrada"
CASE 26
sError = "A sharing violation occurred"
CASE 27
sError = "Asociación a fichero no válida o incompleta"
CASE 28
sError = "DDE Time out"
CASE 29
sError = "DDE transaction failed"
CASE 30
sError = "DDE busy"
CASE 31
sError = "No existe ninguna asociación a la extensión del fichero"
CASE 11
sError = "Invalid EXE file or error in EXE image"
CASE ELSE
sError = "Error desconocido"
END CHOOSE
Messagebox("Error..." + String(lRetorno),sError)
Return -1
END IF
// Todo bien.
Return 1
Teniendo esta función global, tan sólo tenemos que llamarla desde cualquier código, pasándole la ruta. Por ejemplo, desde un botón.
gf_Ejecutar("C:\Mis Documentos\MiDocumento.doc")
Espero que os sea útil ;)
oye manda un erro
ResponderEliminardice BAD RUNTIME FUNCTION REFERENCE AT LINE 13 IN FUNTION GF_EJECUTAR OF OBJECT GF_EJECUTAR
ResponderEliminarContactame al gmailla.g@gmail.com
habria que modificarle el inicio, como sigue:
ResponderEliminar//-------------------------------------------------------------------------
// Función : long gf_Ejecutar(String spRuta)
// Propósito : Ejecuta un fichero, sea lo que sea (doc, pdf, xls, mp3...)
// Parámetros : spRuta.- Ruta del fichero a ejecutar.
// Devuelve : 1.- Todo bien
// -1.- Hay error.
//-------------------------------------------------------------------------
Long lRetorno
String sError
string sNulo
SetNull(sNulo)
Correcto, hay que establecer la variable sNulo a nulo con un SetNull(). Para mí esa era una variable global ya inicializada, se me olvidó comentarlo ;)
ResponderEliminarGracias por el apunte.
Saludos, primero que nada gracias por compartir tu conocimiento.Segundo le intento pasar una variable con la ruta y me dice archivo no encontrado y aun cuando le pongo una ruta directa "C:\Archivos\imagenes\imagen1.tif" por ejemplo me sigue mandado al error de archivo no encontrado cuando se que si existen esos archivos.Alguna idea? Gracias de antemano y ten un gran dia.
ResponderEliminarYa lo solucione muchas gracias =)
ResponderEliminarHola discuklpa, tengo tu mismo error de Fichero no encontrado, podrias compartir tu solución.
ResponderEliminarGracias.
La función funciona correctamente, no se a que puede deberse ese error. Comprobad que la ruta pasada existe realmente, porque la función es bastante básica y funciona sin problemas ;)
ResponderEliminarsi te entiendo pero olvidas algo desde windows vista se utiliza virtualización de directorios y bueno si tu instalas la aplicacion en C. cuando intentas llamar otra aplicación la ruta que toma es appLocal
ResponderEliminarespero me entiendas la funcion sirve para cualquier unidad que no sea C. y en sistemas inferiores, o dime si falta algo especial un manifiesto o algo parecido a provilegios porque esa mensaje de archivo no encontrado es lo que me arroja, muchas gracias por comentar.
con ShellExecuteA funciona
ResponderEliminarFUNCTION long ShellExecute(ulong ihwnd,string lpszOp,string lpszFile,string lpszParams,&
string lpszDir,int wShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"
Muchas gracias me ayudo mucho
ResponderEliminar¿Y si deseo pasar argumentos?
ResponderEliminar