¿Quieres saber cómo puedes almacenar recursos en los ejecutables de Delphi?

Los juegos y otros tipos de aplicaciones que utilizan archivos multimedia como sonidos y animaciones deben distribuir los archivos multimedia adicionales junto con la aplicación o incrustar los archivos dentro del ejecutable.

En lugar de distribuir archivos separados para el uso de su aplicación, puede agregar los datos sin procesar a su aplicación como un recurso. A continuación, puede recuperar los datos de su aplicación cuando sea necesario.

 

Esta técnica es generalmente más deseable porque puede evitar que otros manipulen esos archivos de complementos.

 

Este artículo le mostrará cómo incrustar (y utilizar) archivos de sonido, clips de vídeo, animaciones y, en general, cualquier tipo de archivos binarios en un ejecutable de Delphi. Para el propósito más general verás cómo poner un archivo MP3 dentro de un exe de Delphi.

Archivos de recursos (.RES)

En el artículo "Resource Files Made Easy" se le presentaron varios ejemplos del uso de mapas de bits, iconos y cursores de recursos. Como se indica en ese artículo, podemos usar el Editor de Imágenes para crear y editar recursos que consisten en este tipo de archivos. Ahora, cuando estamos interesados en almacenar varios tipos de archivos (binarios) dentro de un ejecutable de Delphi tendremos que tratar con archivos de script de recursos (.rc), la herramienta Borland Resource Compiler y otros.

 

Incluir varios archivos binarios en su ejecutable consta de 5 pasos:

 

  1. Cree y/o reúna todos los archivos que desee poner en un exe,
  2. Cree un archivo de script de recursos (.rc) que describa los recursos utilizados por su aplicación,
  3. Compila el archivo de script de recursos (.rc) para crear un archivo de recursos (.res),
  4. Enlace el archivo de recursos compilado al archivo ejecutable de la aplicación,
  5. Utilice el elemento de recurso individual.

 

El primer paso debe ser simple, simplemente decida qué tipos de archivos desea almacenar en su ejecutable.

Por ejemplo, almacenaremos dos canciones.wav, una animación.ani y una canción.mp3.

 

Antes de seguir adelante, he aquí algunas declaraciones importantes sobre las limitaciones a la hora de trabajar con recursos:

 

  1. a) La carga y descarga de recursos no es una operación que requiera mucho tiempo. Los recursos son parte del archivo ejecutable de la aplicación y se cargan al mismo tiempo que ésta se ejecuta.

 

  1. b) Toda la memoria (libre) puede ser utilizada al cargar/descargar recursos. En otras palabras, no hay límites en el número de recursos cargados al mismo tiempo.

 

  1. c) Por supuesto, los archivos de recursos duplican el tamaño de un ejecutable. Si desea un ejecutable más pequeño, considere la posibilidad de colocar recursos y partes de su proyecto en DLLs y paquetes.

Ahora veamos cómo crear un archivo que describa los recursos.

 

Creación de un archivo de comandos de recurso (.RC)

Un archivo de script de recursos es un simple archivo de texto con la extensión.rc que enumera los recursos. El archivo de script está en este formato:

 

ResName1 ResTYPE1 ResFileName1

ResName2 ResTYPE2 ResFileName2

...

ResNameX ResTYPEX ResFileNameX

...

 

RexName especifica un nombre único o un valor entero (ID) que identifica al recurso. ResType describe el tipo de recurso y ResFileName es la ruta completa y el nombre del archivo del recurso individual.

 

Para crear un nuevo archivo de script de recursos, simplemente haga lo siguiente:

  1. Cree un nuevo archivo de texto en el directorio de proyectos.
  2. Cambie el nombre a AboutDelphi.rc.

 

En el archivo AboutDelphi.rc, tenga las siguientes líneas:

 

Clock WAVE "c:\mysounds\projects\clock.wav"

MailBeep WAVE "c:\windows\media\newmail.wav"

Cool AVI cool.avi

Intro RCDATA introsong.mp3

 

El archivo de script simplemente define los recursos. Siguiendo el formato dado, el script AboutDelphi.rc lista dos archivos.wav, una animación.avi y una canción.mp3. Todas las sentencias en un archivo.rc asocian un nombre, tipo y nombre de archivo de identificación para un recurso dado. Hay una docena de tipos de recurso predefinidos. Estos incluyen iconos, mapas de bits, cursores, animaciones, canciones, etc. El RCDATA define los recursos de datos genéricos. RCDATA le permite incluir un recurso de datos sin procesar para una aplicación. Los recursos de datos sin procesar permiten la inclusión de datos binarios directamente en el archivo ejecutable.

Por ejemplo, la sentencia RCDATA anterior nombra el recurso binario Intro de la aplicación y especifica el archivo introsong.mp3, que contiene la canción para ese archivo mp3.

 

Nota: asegúrese de tener disponibles todos los recursos que figuran en su archivo.rc. Si los archivos están dentro del directorio de proyectos, no es necesario incluir el nombre completo del archivo. En mi archivo.rc las canciones.wav se encuentran *en algún lugar* del disco y tanto la animación como la canción mp3 se encuentran en el directorio del proyecto.

 

Creación de un archivo de recurso (.RES)

Para usar los recursos definidos en el archivo de script de recursos, debemos compilarlo en un archivo.res con el compilador de recursos de Borland. El compilador de recursos crea un nuevo archivo basado en el contenido del archivo de script de recursos. Este archivo suele tener una extensión.res. El enlazador Delphi formateará el archivo.res en un archivo objeto de recurso y luego lo enlazará con el archivo ejecutable de una aplicación.

La herramienta de línea de comandos del compilador de recursos de Borland se encuentra en el directorio Delphi Bin. El nombre es BRCC32.exe. Simplemente vaya a la línea de comandos y escriba brcc32 y luego presione Enter. Dado que el directorio Delphi\Bin está en su ruta, el compilador Brcc32 es invocado y muestra la ayuda de uso (ya que fue llamado sin parámetros).

 

Para compilar el archivo AboutDelphi.rc en un archivo.res ejecute este comando en la línea de comandos (en el directorio de proyectos):

 

BRCC32 AboutDelphi.RC

 

Por defecto, cuando se compilan recursos, BRCC32 nombra el archivo de recursos compilados (.RES) con el nombre base del archivo.RC y lo coloca en el mismo directorio que el archivo.RC.

Puede nombrar el archivo de recursos como quiera, siempre y cuando tenga la extensión ".RES" y el nombre del archivo sin la extensión no sea el mismo que el de cualquier unidad o nombre de archivo del proyecto. Esto es importante, porque por defecto, cada proyecto Delphi que compila en una aplicación tiene un archivo de recursos con el mismo nombre que el archivo de proyecto, pero con la extensión.RES. Es mejor guardar el archivo en el mismo directorio que el archivo de proyecto.

 

Inclusión de recursos (vinculación/embalaje) en los ejecutables

Con el compilador de recursos de Borland hemos creado el archivo de recursos AboutDelphi.res. El siguiente paso es añadir la siguiente directiva de compilador a una unidad de su proyecto, inmediatamente después de la directiva de formulario (debajo de la palabra clave de implementación).

 

 {$R *.DFM} {$R AboutDelphi.RES}

 

No borre accidentalmente la parte {$R *.DFM}, ya que esta es la línea de código que le dice a Delphi que enlace en la parte visual del formulario. Cuando elige mapas de bits para botones de velocidad, componentes de imagen o componentes de botón, Delphi incluye el archivo de mapa de bits que ha elegido como parte del recurso del formulario. Delphi aísla los elementos de la interfaz de usuario en el archivo.DFM.

Después de enlazar el archivo.RES con el archivo ejecutable, la aplicación puede cargar sus recursos en tiempo de ejecución según sea necesario. Para utilizar el recurso, tendrá que realizar algunas llamadas a la API de Windows.

 

Para seguir el artículo necesitarás un nuevo proyecto Delphi con un formulario en blanco (el nuevo proyecto por defecto). Por supuesto, agregue la directiva {$R AboutDelphi.RES} a la unidad del formulario principal. Finalmente es hora de ver cómo usar los recursos en una aplicación Delphi. Como se mencionó anteriormente, para poder utilizar los recursos almacenados dentro de un archivo exe tenemos que tratar con la API. Sin embargo, se pueden encontrar varios métodos en los archivos de ayuda de Delphi que están habilitados como "recurso".

 

Por ejemplo, mire el método LoadFromResourceName de un objeto TBitmap.

 

Este método extrae el recurso bitmap especificado y le asigna el objeto TBitmap. Esto es *exactamente* lo que hace la llamada a la API de LoadBitmap. Como siempre Delphi ha mejorado una llamada de función de API para satisfacer mejor sus necesidades.

Reproducción de animaciones desde recursos

Para mostrar la animación dentro del archivo cool.avi (recuerde que fue definido en el archivo.rc) usaremos el componente TAnimate (paleta Win32) - suéltelo en el formulario principal. Deje que el nombre del componente Animar sea el predeterminado: Animar1. Usaremos el evento OnCreate de un formulario para mostrar la animación:

 

 procedure TForm1.FormCreate(Sender: TObject) ;

begin

 with Animate1 do begin

  ResName := 'cool';

  ResHandle := hInstance;

  Active := TRUE;

 end;

end;

 

¡Así de simple! Como podemos ver, para reproducir una animación desde un recurso tenemos que usar las propiedades ResHandle, ResName o ResID del componente TAnimate. Después de establecer ResHandle, establecemos la propiedad ResName para especificar qué recurso es el clip AVI que debe mostrar el control de animación. Asignar True a la propiedad Active simplemente inicia la animación.

Reproducción de WAVs

Ya que hemos colocado dos archivos WAVE en nuestro ejecutable, ahora veremos cómo agarrar una canción dentro del exe y reproducirla. Suelte un botón (Button1) en un formulario y asigne el siguiente código al manejador de eventos OnClick:

 

 uses mmsystem;

...

procedure TForm1.Button1Click(Sender: TObject) ;

var

  hFind, hRes: THandle;

  Song: PChar;

begin

 hFind := FindResource(HInstance, 'MailBeep', 'WAVE') ;

 if hFind <> 0 then begin

   hRes:=LoadResource(HInstance, hFind) ;

   if hRes <> 0 then begin

     Song:=LockResource(hRes) ;

     if Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory) ;

     UnlockResource(hRes) ;

   end;

   FreeResource(hFind) ;

 end;

end;

Este enfoque utiliza varias llamadas a la API para cargar un recurso de tipo WAVE llamado MailBeep y reproducirlo. Nota: puede utilizar Delphi para reproducir sonidos predefinidos del sistema.

 

Reproducción de MP3

El único archivo MP3 en nuestro recurso tiene el nombre Intro. Como este recurso es de tipo RCDATA, usaremos otra técnica para obtener y reproducir la canción en mp3. En caso de que no sepas que Delphi puede reproducir canciones en MP3, lee el artículo "Construye tu propio WinAmp". Sí, así es, el TMediaPlayer puede reproducir el archivo mp3.

Ahora, añada el componente TMediaPlayer a un formulario (nombre: MediaPlayer1) y añada un botón TB (Button2). Deje que el evento OnClick se vea como:

 

procedure TForm1.Button2Click(Sender: TObject) ;

var

 rStream: TResourceStream;

 fStream: TFileStream;

 fname: string;

begin

 {this part extracts the mp3 from exe}

 fname := ExtractFileDir(Paramstr(0))+'Intro.mp3';

 rStream := TResourceStream.Create(hInstance, 'Intro', RT_RCDATA) ;

 try

  fStream := TFileStream.Create(fname, fmCreate) ;

  try

   fStream.CopyFrom(rStream, 0) ;

  finally

   fStream.Free;

  end;

 finally

  rStream.Free;

 end;

 {this part plays the mp3}

 MediaPlayer1.Close;

 MediaPlayer1.FileName:=fname;

 MediaPlayer1.Open;

end;

Este código, con la ayuda de TResourceStream, extrae la canción mp3 del exe y la guarda en el directorio de trabajo de las aplicaciones. El nombre del archivo mp3 es intro.mp3. A continuación, simplemente asigne ese archivo a la propiedad FileName de un MediaPlayer y reproduzca la canción.

Un pequeño *problema* es que la aplicación crea una canción mp3 en una máquina de usuario. Puede agregar un código que elimine ese archivo antes de que se termine la aplicación.

 

Extrayendo *...*???

Por supuesto, cualquier otro tipo de archivo binario puede almacenarse como un tipo RCDATA. El TRsourceStream está diseñado especialmente para ayudarnos a extraer dicho archivo de un ejecutable. Las posibilidades son infinitas: HTML en un exe, EXE en exe, base de datos vacía en un exe, .....

(0 votes)