Añadir un ejecutable dentro de otro

5522 vistas

A veces, por razones de simplificación de instalación, puede ser interesante añadir un segundo ejecutable dentre de su propio programa. Su estracción la realiza el propio programa, simulando, pues, el principio de un archivo auto-extraible seguido de la ejecución de código.

La idea es crear un fichero de recursos que contenga los datos del fichero a incluir después de declarar, dentro del código del programa principal, una directiva de compilación de tipo {$R nombre.res}. Esto informará al compilador que debe añadir el fichero de recursos nombre.res al ejecutable creado en la compilación.

Esta operación es similar al principio de concatenación de ficheros via comandos:



delphi
  1. Copy /B Fichero1.exe+Fichero2.exe



La dificultad radicará en saber donde termina Fichero1.exe y dónde empieza Fichero2.exe. A fin de resolver este problema, Delphi nos ayudará.

Veamos las etapas a seguir para crear el fichero de recursos, la inclusión y extracción del ejecutable:
1- En la carpera que contenga el fichero a incluir, creamos un nuevo documento de texto con un editor ASCII.
2- En él vamos a escribir lo siguiente:



delphi
  1. NombreDelRecurso RCDATA NombreDelEjecutable



Ejemplo: para el bloc de notas, llamado notepad.exe, escribirÃamos:



delphi
  1. BlocDeNotas RCDATA "notepad.exe"



3- Guardar el fichero con un nombre de formato Nombre.rc. El nombre tendra que ser el indicado en la directiva de compilación añadida en el código fuente. Sólo cambiará la extensión, ya que el fichero Nombre.res se generará a partir de éste.
4- Desde una ventana de cónsola, nos posicionamos en la carpeta que contiene el fichero de texto y ejecutamos el comando:



delphi
  1. brcc32 Nombre.rc



El programa brcc32.exe es el compilador de recursos proporcionado con Delphi. Una vez creado el fichero de recursos, lo movemos, si es necesario, a la misma carpeta que contenga los fuentes de nuestro programa principal.
5- Ahora, en la unidad principal de nuestro programa, añadimos la directica de compilación "{$ Nombre.res}". De esta manera, después de cada compilación, se añadirá el recurso (aquà un fichero .exe) a nuestro programa principal.
6- A partir de ahora, para poder usar este recurso, tendremos que crear dos strams: un TFileStream y un TResourceStream.
Crear el TResourceStream pasándole por parámetro las informaciones necesarias para la obertura del recurso incluido:



delphi
  1. MiResourceStream := TResourceStream.Create(hInstance, Nombre, RT_RCDATA);



  • hInstance es el handle de la aplicación
  • Nombre es un string que contiene el nombre del recurso que queremos extraer. Si tomamos el ejemplo anterior, nombre = "BlocDeNotas"
  • RT_RCDATA indica el tipo de recurso, como se ha especificado en el fichero nombre.rc
   
ahora creamos el TFileStream en modo creación de fichero (opción fmCreate) dándole el nombre de fichero que queramos y ejecutamos la instrucción:



delphi
  1. MiFileStream.CopyFrom(MiResourceStream);



Esta operación extrae un fichero incluido como recurso en la carpeta deseada.

Para más información de uso de recursos con nuestra aplicación, aconsejamos la lectura de este artÃculo de DelphiCool (web en francés).

También decir que existe un componente shareware, TRCData, que permite esta operación en diseño (web en francés)