Como ejecutar cualquier fichero en PowerBuilder

Para ejecutar un fichero en PowerBuilder se puede utilizar la función Run(), pero es un método bastante básico que sólo permite ejecutar .exe.

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

11 comentarios:

  1. dice BAD RUNTIME FUNCTION REFERENCE AT LINE 13 IN FUNTION GF_EJECUTAR OF OBJECT GF_EJECUTAR
    Contactame al gmailla.g@gmail.com

    ResponderEliminar
  2. habria que modificarle el inicio, como sigue:


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

    ResponderEliminar
  3. 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 ;)
    Gracias por el apunte.

    ResponderEliminar
  4. 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.

    ResponderEliminar
  5. Ya lo solucione muchas gracias =)

    ResponderEliminar
  6. Hola discuklpa, tengo tu mismo error de Fichero no encontrado, podrias compartir tu solución.

    Gracias.

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

    ResponderEliminar
  8. si 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
    espero 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.

    ResponderEliminar
  9. con ShellExecuteA funciona

    FUNCTION long ShellExecute(ulong ihwnd,string lpszOp,string lpszFile,string lpszParams,&
    string lpszDir,int wShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"

    ResponderEliminar
  10. Muchas gracias me ayudo mucho

    ResponderEliminar

Mi foto
Geek y Friki de amplio espectro pero de baja intensidad. Bloguero, forero y jugón online. Y Papá. Cada vez con menos tiempo para los hobbies.
Experto en PowerBuilder.
¿Te ha gustado? Haz un +1 en Google!

También te puede interesar...