Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Утилита BinOBJ


 Предыдущая страница  
Добавить в избанное Обсудить в форуме Написать автору сайта

     Программа BINOBJ.EXE  предназначена для конвертирования любого файла в .OBJ файл,  таким образом,  что он  может  компоноваться  в программу Турбо Паскаля как "процедура". Это весьма полезно, если у Вас имеется файл двоичных  даннных,  который  должен  находиться  в сегменте  кода  или  если  размер  файла данных слишком большой для формирования массива типированных  констант.  Например,  Вы  можете использовать  BINOBJ  с  модулем  GRAPH для связывания графического устройства или файлов печати с Вашим .EXE файлом.  В  этом  случае, для  использования  Вашей  графической  программы,  Вам нужно иметь только .EXE файл.  (см.  пример GRLINK.PAS на дистрибутивном  диске N2).

         BINOBJ  принимает три параметра:

         BINOBJ  <источник[.BIN]> <место назначения [.OBJ]>

                 <общее имя>

где источник - двоичный файл, подлежащий преобразованию, место назначения - имя  формируемого  .OBJ  файла,  и  общее  имя  -  имя процедуры, которая будет обьявлена в Вашей программе.

     В следующем примере,  процедура Showscreen принимает указатель в качестве параметра и передает 4000 байтов данных в память экрана. Файл MENU.DTA   содержит  образ  главного меню экрана (80*25*2=4000 байтов).

     Ниже приводится  простая  (без  проверок  на  ошибки)   версия программы MYPROGRAM.PAS:

          program MyProg;

          procedure ShowScreen(var ScreenData : pointer;

         {Отображение полного экрана, без проверки на ошибки!}

         var

           ScreenSegment: word;

          begin

           if (Lo(LastMode) = 7) then                    ( Mono? )

             ScreenSegment := $B000

          else

            ScreenSegment := $B800;

         Move(ScreenData^,                        { По указателю }

                      Ptr(ScreenSegment,0)^    { В память экрана }

                      4000);                       ( 80 * 25 * 2 )

         end;

          var

           MenuP : pointer;

           MenuF : file;

         begin

           Assign(MenuF,'MENU.DTA'); {Открытие файла данных экрана}

           Reset(MenuF, 1);

           GetMem(MenuP, 4000);         { Размещение буфера в куче}

           BlokRead(MenuF, MenuP^,4000);     {Чтение данных экрана}

           Close(MenuF);

           ShowScreen(MenuP);                  {Отображение экрана}

         end.

      Файл данных экрана MENU.DTA открывается и считывается  в буфер кучи.  Оба  файла  MYPROG.EXE  и  MENU.DTA  должены присуствовать в момент выполнения программы.  Вы  можете  использовать  BINOBJ  для пребразования   MENU.DTA  в  .OBJ  файл  (MENUDTA.OBJ)  и  сообщить программе о необходимости связи этого файла с  процедурой MenuData. Затем  Вы  можете  об'явить  внешней  процедуру  MenuData,  которая фактически будет содержать экранные данные. Скомпоновав .OBJ файл с помощью  директивы  компилятора  $L,  MenuData  будет  длинной 4000 байтов и  будет  содержать  данные  Вашего  экрана.  Прежде  всего, вызовите BINOBJ для обработки MENU.DTA.

          binobj MENU.DTA MENUDTA MenuData

      Первый параметр  MENU.DTA  указывает  на  обычный  файл данных экрана, второй - MENUDTA - это имя создаваемого .OBJ файла (т.к. не указано расширение,  будет  добавлено  .OBJ).  Последней параметр - MenuData - имя внешней процедуры,  которая будет об'явлена в  Вашей программе.  Теперь,  поскольку  Вы  конвертировали  MENU.DTA в .OBJ файл,  новая версия программы MYPROG.PAS будет выглядеть  следующим образом:

          program MyProg;

          procedure ScowScreen(ScreenData : pointer);

         {Отображение полного экрана, без проверок на ошибки}

         var

           ScreenSegment: word;

         begin

           if (Lo(LastMode) = 7) then                     ( Mono? )

             ScreenSegment :=$B000

           else

             ScreenSegment :=$B800;

         Move(ScreenData^,                           {По умолчанию}

                        Ptr(ScreenSegment,0)^     {В память экрана}

                        4000);                      ( 80 * 25 * 2 )

       end;

        procedure MenuData; external;

       ($L MENUDTA.OBJ)

       begin

         ShowScreen(&MenuData);                {Отображение экрана}

       end.

      Заметьте, что процедура ShowScreen не изменилась,  и что адрес Вашей процедуры передается с употреблением оператора @.

     Преимущество связывания  данных экрана с .EXE файлом очевидно. Вам  нет  необходимости  осуществлять   какую-либо   поддержку   по оперированию  с файлами для использования основной программы. Кроме того,  у  Вас  есть  преимущество,  заключающееся   в   возможности обращения к экрану по имени (MenuData). Недостатки:

      - Каждый  раз  при  модификации  файла  информации экрана,  Вы должны заново преобразовывать ее в .OBJ  файл  и  перекомпилировать программу MYPROG.

     - Вы  должны  иметь  отдельный .OBJ файл (и внешнюю процедуру) для каждого экранного меню, которое Вы хотите отобразить.

      Программа BINOBJ  особенно  полезна при стабильности двоичного файла.  Одна  из  простых  графических   программ   (находится   на дистрибутивной   дискете   N2)  GRLINK.PAS  использует  BINOBJ  для построения двух модулей, которые содержат драйвер и файлы печати.

[оглавление]


Предыдущая страница


Добавить в избанное Обсудить в форуме Написать автору сайта

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz