La Página de DriverOp

Incluir los archivos .BGI en el ejecutable Turbo Pascal.

Es muy útil incluir los drivers gráficos proporcionados por Borland en el paquete de Turbo Pascal dentro de nuestro propio archivo ejecutable .exe, de esa forma solo tenemos que distribuir un solo archivo y no tener que preocuparnos demasiado por si los archivos .bgi necesarios están presentes en el directorio actual donde se ejecuta nuestro programa; pero esto tiene la penalización de que nuestro .exe aumentará considerablemente de tamaño.

En los pasos que comentaré a continuación incluiré el driver gráfico para modos EGA/VGA (egavga.bgi) que viene con la instalación estandar de Turbo Pascal 7.0.

Para comenzar se necesita de la utilidad binobj.exe que viene en el paquete de instalación de Turbo Pascal y, por supuesto, el o los archivos .bgi que vamos a incluir en el .exe.

Estando en el directorio donde se encuentran esos archivos ejecutar en el prompt del DOS los siguientes comandos:

binobj egavga.bgi egavga EGAVGADriverProc

Esto creará un archivo llamado egavga.obj. Ese archivo hay que linkearlo en nuestro programa. Para ello se usa la directiva de compilación {$L}. Además hay que declarar en nuestro código fuente un procedimiento de tipo external con el mismo nombre que se usó en el tercer parámetro del comando recién visto:

uses crt, graph;
procedure EGAVGADriverProc; external;
{$L egavga.obj }

La cláusula "external" le dice al compilador que ese procedimiento no está desarrollado en el código fuente actual sino que está en otro archivo cuyo código fuente no tenemos, ese archivo es el egavga.obj que linkeamos con la directiva {$L} a continuación.

Seguidamente es necesario registrar ese procedimiento external como el inicializador del modo gráfico, para ello se usa el procedimiento estandar de la biblioteca Graph RegisterBGIDriver de esta manera:

 if RegisterBGIDriver(@EGAVGADriverProc)<0 then
   begin
     Writeln('Error registrando driver: ',GraphErrorMsg(GraphResult));
     Halt(1);
    end
  else WriteLn('Funciona!.');

RegisterBGIDriver devuelve un código de error menor a cero si algo ha salido mal y cero si se pudo regristrar el procedimiento. Se usa un @ porque lo que el procedimiento RegisterBGIDriver espera es un puntero a una función.

Finalmente podemos inicializar el modo gráfico sin necesidad de especificar el archivo de driver:

  grDriver := Detect;
  InitGraph(grDriver, grMode,'');

Notar que el tercer parámetro de InitGraph está vacío.

Ahora el código fuente completo para cargar el driver incluido en nuestro .exe.

uses crt, graph;

var
 grDriver: Integer;
 grMode: Integer;

procedure EGAVGADriverProc; external; {$L egavga.obj }

begin
  if RegisterBGIDriver(@EGAVGADriverProc)<0 then
    begin
      Writeln('Error registrando driver: ', GraphErrorMsg(GraphResult));
      Halt(1);
    end
  else WriteLn('Funciona!.');

 grDriver := Detect;
 InitGraph(grDriver, grMode,'');
 Outtext('Modo gráfico.');
 ReadKey;
 CloseGraph;
end.

Por Diego Romero,