Como ejecutar (correr) un programa externo desde nuestra aplicación Delphi, o la aplicación asociada a un documento

Ejecutando una aplicación externa

Copyright © 2000 Ernesto De Spirito

InstallAWARE - MSI sin ciencia espacial

ShellExecute

Muchas veces necesitamos ejecutar otro programa desde el nuestro. Para hacerlo, podemos usar la función ShellExecute declarada en la unidad ShellAPI. La sintaxis es:

ShellExecute(Manejador, Operación, NombreFichero,
             Parámetros, Carpeta, Mostrar)
  • Manejador (HWND) es el manejador (window handle) de la ventana madre, por ejemplo el manejador del formulario principal de nuestra aplicación.
  • Operación (PChar) es un puntero a una cadena terminada en nulo conteniendo el nombre de la operación a realizar, pudiendo ser 'edit' (ejecuta un editor y abre el documento para edición), 'explore' (explora el directorio especificado), 'find' (abre la ventana "Buscar" comenzando en el directorio especificado), 'open' (ejecuta o abre el archivo con la aplicación asociada), 'print' (imprime el archivo especificado) o 'properties' (muestra las propiedades del archivo o carpeta). Este parámetro también puede ser nil y en tal caso se asumirá la operación 'open' (abrir).
  • NombreFichero (PChar) es un puntero a una cadena terminada en nulo conteniendo el camino y el nombre de la aplicación a ejecutar, el documento abrir o imprimir con la aplicación asociada o la carpeta a abrir o explorar.
  • Parámetros (PChar) es un puntero a una cadena terminada en nulo conteniendo los parámetros que se pasan a la aplicación indicada en NombreFichero. Si NombreFichero no especificaba un ejecutable sino un documento, entonces Parámetros debe ser nil.
  • Carpeta (PChar) es un puntero a una cadena terminada en nulo conteniendo el camino de la carpeta que se tomará como directorio por omisión de la aplicación. Se corresponde con el cuadro de texto "Iniciar en:" de las propiedades de los accesos directos. Este parámetro puede ser nil.
  • Mostrar (Integer) especifica la forma en que se mostrará la aplicación especificada en NombreFichero. Hay varios valores posibles:
    SW_HIDE
    SW_RESTORE
    SW_SHOW
    SW_SHOWNA
      SW_SHOWNORMAL
    SW_SHOWDEFAULT
    SW_MAXIMIZE
    SW_MINIMIZE
      SW_SHOWMAXIMIZED
    SW_SHOWMINIMIZED
    SW_SHOWMINNOACTIVE
    SW_SHOWNOACTIVATE

    La documentación indica que si NombreFichero se refiere a un documento, Mostrar debería ser 0, sin embargo si prueban otros valores verán que sí funcionan.

Valor devuelto: Si la función tiene éxito, ShellExecute devuelve un valor tipo HINST (definido como LongWord) con el manejador (handle) de la aplicación que se ejecutó o el manejador de la aplicación servidora DDE. Si la función fracasa (o sea, si la aplicación no pudo iniciarse), el valor devuelto es un código de error entre 0 y 32.

Ejemplos

uses ShellAPI;

...

if ShellExecute(Form1.Handle, nil, 'c:\windows\general.txt',
    nil, nil, SW_SHOWNORMAL) <= 32 then
  Application.MessageBox('No se pudo ejecutar la aplicación',
    'Error', MB_ICONEXCLAMATION);

ShellExecute(Form1.Handle, nil, 'c:\windows\notepad.exe',
  'c:\windows\general.txt', nil, SW_SHOWMAXIMIZE);

ShellExecute(Form1.Handle, 'open', 'c:\windows\notepad.exe',
  'general.txt', 'c:\windows', SW_SHOWNORMAL);

ShellExecute(Form1.Handle, nil, PChar(fname + '.txt'),
  nil, nil, SW_MAXIMIZE);

ShellExecute(Form1.Handle, nil, 'c:\windows\notepad.exe',
  nil, nil, SW_SHOWNORMAL);

Nota

Una aplicación llamada por ShellExecute correrá asíncronamente, esto es, la ejecución de nuestra aplicación continúa sin esperar el final de la aplicación llamada que correrá simultáneamente. Si necesita ejecutar una aplicación en modo síncrono, por favor lea Esperando a que una aplicación termine.

JfControls Library - para Delphi y C++ Builder