Как включить BGI драйвер в EXE файл?
   
Обычно для работы программы, использующей графические режимы, необходимо присутствие одного или нескольких вспомогательных файлов (BGI-файлов, или драйверов; CHR-файлов, или шрифтов). Это не очень хорошо, так как чем меньше дополнительных файлов требуется для запуска бинарника, тем надежнее будет работать программа. Устранить это неудобство можно включением содержимого BGI/CHR файлов внутрь EXE-файла.

Для этого нужно воспользоваться утилитой binobj, и директивой компилятора {$L filename}, которая предписывает компилятору скомпоновать указанный файл с компилируемой программой или модулем. Директива {$L имя_файла} обычно используется для компоновки кода, написанного на ассемблере. Кроме линковки с OBJ файлами данная директива может использоваться и для включения BGI драйверов и шрифтов в EXE файл (для полностью автономной работы программы). Для того чтобы произвести эту операцию нужно сделать следующее:
  1. С помощью утилиты binobj.exe (входящей в дистрибутив Турбо Паскаля) преобразовать все необходимые для работы программы BGI файлы в OBJ-формат (работа с утилитой BINOBJ осуществляется из командной строки):
    binobj egavga.bgi egavga.obj egavgaDriverProc
    , аналогично преобразуются CHR-файлы:
    binobj small.chr small.obj smallFontProc


    Для упрощения преобразования файлов можно создать два BAT-файла:
    drivers.bat
    binobj %1.bgi %1.obj %1DriverProc
    и fonts.bat
    binobj %1.chr %1.obj %1FontProc
    , тогда преобразования могут выполняться так:
    C:\TP\BGI>drivers cga
    C:\TP\BGI>drivers egavga
    C:\TP\BGI>drivers herc
    ...
    C:\TP\BGI>fonts sans
    C:\TP\BGI>fonts trip
  2. Подключить полученные OBJ файлы к программе:
    {$L EGAVGA.OBJ} Procedure EGAVGADriverProc; External;
    Сама инициализация графики (например, режима VGA) будет осуществляться так:
    ...
    Var grDriver, grMode, ErrCode: Integer;
    ...
    
    Begin
      If RegisterBGIDriver(@EGAVGADriverProc) < 0 Then Begin
        WriteLn('Error registering driver : ', GraphErrorMsg(GraphResult)); Halt(100)
      End;
      grDriver := VGA;
      grMode := VGAHi;
      InitGraph(grDriver, grMode, '');
      ErrCode := GraphResult;
    
      If ErrCode <> grOk Then Begin
        WriteLn('Graphics error : ', GraphErrorMsg(ErrCode)); Halt(100)
      End;
    ...
    End.
После этого можно не заботиться о наличии в текущей директории соответствующего BGI драйвера, также, как и файлов шрифтов.



Free Web Hosting