Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

eManual.ru - электронная документация

Секция 2 из 2 - Предыдущая - Следующая

            Repeat
                  BlockRead(f1,p^,32768,rb);
                  BlockWrite(f2,p^,rb);
            Until rb<>32768;
            FreeMem(p,32768);
            Close(f2); Close(f1);
     End;

A:>  Есть и более изящный вариант, реализованный в следующей проге:

     Uses Objects;
     Var
         S1, S2: TBufStream;
     Begin
       If ParamCount <> 2 Then Halt(1);
       S1.Init(ParamStr(1), stOpenRead);
       S2.Init(ParamStr(2), stCreate);
       S2.CopyFrom(S1, S1.GetSize);
       S2.Done;
       S1.Done;
     End.


------------------------------------------------------------------------------
Q:>  2.4.4  Как определить под какой операционкой мы
            запустились?

A:>  Методов есть много и нет ни одного 100%-ного.
     Основные методы:
        Анализ фала C:command.com (в Win9X он на самом деле .exe)
        Анализ версии Дос
        Анализ переменных окружения. (Тут есть одна хитрость.
        В Win9X есть переменная окружения windir. Особенность в том,
        что набрана она маленькими буквами и стандартная GETENV её не
        возвращает. Зато если перебрать все переменные окружения и
        проверить.... можно и масдайку расколоть если она того не
        хочет)
     Дополнительные примеры - см DzeServer.


------------------------------------------------------------------------------
Q:>  2.4.5  Как читать клавиши курсора, F1-F12 и т.д.?

A:>  Эти клавиши кодируются двумя байтами: #0 +<код>
     Есть таблицы для всех этих символов, но можно обойтись и без них
     Откомпилите эту программку и будете знать коды любых клавиш =)

     uses Crt;
      var
        Key: char;
     Begin
      while true do Begin
           Key:=readkey;
           case Key of
                #0: WriteLN('#0 + #', ord(readkey));
                #27: Begin WriteLN('#27 - Esc pressed.'); Halt; End;
                Else WriteLN(ord(key))
           End;
      End;
     End.

     ps  А можно ещё и скан-коды юзать, но это гемор и не всегда
         оправданно.

------------------------------------------------------------------------------
Q:>  2.4.5  Как получить в свое распоряжение больше чем
                640 кило памяти?

A:>  Юзать библиотеки для работы c EMS и XMS
     Компилировать в DPMI или под Винды причем желательно 32-битными
     компиляторами.

------------------------------------------------------------------------------
Q:>  2.4.6  Как в BP юзать 32-разрядный асм?

A:>  Поставить перед командой префикс: db 66h. Например,

        db 66h
        mov ax,bx
     эквивалентно mov eax,ebx в нормальном асме,

        db 66h
        movsw
     эквивалентно movsd. Только если засылается значение, придется
     недостающие байты отдельно задавать, иначе компилер не поймет.
     То есть:

       db 66h
       mov ax,5678h
       dw 1234h
     эквивалентно mov eax,12345678h в нормальном асме.
     Заодно: для 32х битных адресных выражений используется префикс 67h.

     (С)  Alexey Dorohin (2:5022/43.34)

------------------------------------------------------------------------------
Q:>  2.4.7  Как писать TSR'ы?

A:>  Для написания TSR'ов, программ которые остаются в памяти после
     передачи управления операционной системе, используется функция
     keep. Почитать о ней можно в хелпе, там же приведён пример самого
     простого резидента. Естественно для нормального резидента нужно
     активизироваться по каким-то событиям. Для этого обычно перехватывают
     какие-либо прерывания. Например прерывание клавиатуры
     (int 9h) или таймера (int 1Ch или 08h). Как повесить обработчик
     своего прерывания на int 1Ch показано в хелпе по Get/SetIntVec.
     Кроме того для настоящего TSR'а необходима нормальная выгрузка.
     Для этого необходимо создание каких-либо семафоров. Каких именно -
     все зависит только от вашей фантазии. Годиться почти все: начиная
     с файлов и заканчивая указателями прерываний.
     Примеры резидентов на Паскале опять же на DzeServer'е.


------------------------------------------------------------------------------
Q:>  2.4.8  Как осуществить поиск файла по всем директориям?

A:>  Необходимо воспользоваться процедурами FindFirst/FindNext и
     рекурсией. Например:
     Вот пример самой простенькой програмки. Алгоритм тут весьма
     прозрачен, так что без комментариев.

     uses Dos;
     {
      Эта программа ищет все файлы по маске turbo.* в поддиректориях
      папки C: и выводит на экран их полные имена =)
      Основа программы - функция SearchDir её параметры -
      fn - маска, Dir -начальная директория.
     }
     procedure SearchDir(fn, Dir:string);
     var
       SRec: SearchRec;
       ckl:integer;
       F:file;
       regs:registers;
     begin
      if dir[length(dir)]<>'' then Dir:=Dir+'';

      FindFirst(Dir+fn, AnyFile, SRec);
      while DosError = 0 do begin
            WriteLN(Dir+SRec.Name);
            FindNext(SRec);
      End;
      FindFirst(Dir+'*.*', Directory, SRec);
      while DosError = 0 do begin
            with SRec do
                 if (Attr and 16 <> 0 ) and (Name[1]<>'.') then
                        SearchDir(fn,Dir+Name);
                 FindNext(SRec);
            end;

     end;

     Begin {program}
          SearchDir('turbo.*', 'C:');
     End. {program}


------------------------------------------------------------------------------
Q:>  2.5  Файлы

     Вопросы связанные с типами файлов и доступа к ним.

------------------------------------------------------------------------------
Q:>  2.5.1  Где взять описание <такого-то> формата файлов?

A:>  В программерских эхах, faqServer'ах. Если нигде не нашли
     советую посмотреть на http://www.wotsit.org
     По некоторым отзывам - очень неплохое байтохранилище с
     немереным количеством описаний типов файла.

------------------------------------------------------------------------------
Q:>  2.5.2  Как прочитать mp3 tag?

A:>  MP3-файл заканчивается следующей структурой:

     TagCharRec = Record
       ident    : array [1..03] of char;
       title    : array [1..30] of char;
       artist   : array [1..30] of char;
       album    : array [1..30] of char;
       year     : array [1..04] of char;
       comment  : array [1..30] of char;
       genre    : byte;
     End;

     всего      : 128 bytes

     Причём ident='TAG'. Если это не так, то по-ходу дела нужно
     дописывать эту структуру, а не изменять.
     genre - номер жанра. $FF - не указан.


------------------------------------------------------------------------------
Q:>  2.5.3  Как прочитать файлы с картинками (*.bmp; *.jpg)?

A:>  Стандартных функций для этого нет (если не считать Дельфи)
     Поэтому выход один - брать описания типов и писать самому.
     Хотя нет... есть ещё один. Взять уже написанные кем-либо
     модуле. Где взять? Да полно их. Опять же на DzeServer'е =)

------------------------------------------------------------------------------
Q:>  2.5.4  Как удалить строку из текстового файла?

A:>  Только переписывая его заново, пропуская ненужную строку.
     То же самое относиться и к бинарным файлам. Можно немного
     оптимизировать этот процесс, но принципиально ничего другого
     не остаётся =(

------------------------------------------------------------------------------
Q:>  2.5.5  Как читать .ctl/.cfg -файлы?

A:>  Вот один из вариантов:
     Думаю здесь все до безобразия прозрачно.
     F - файл, откуда читаем
     S, S1 - служебные переменные, строки (зачем s1 - думаю понятно)
     'KEYKODE' - название читаемого параметра (регистр не имеет
                 значения - для этого и S1)
     varKeyCode - собственно переменная куда читать.

        while not eof(F) do Begin
                readLn(F, S);
                if S='' then continue;
                if S[1]=';' then continue;
                if Pos(';', S) <> 0 then    {отсекает то, что не нужно}
                        S:=copy(S, 1, Pos(';', S)-1);
                S1:=UpLine(S);     {Функция перевода в верхний регистр}

                if copy(S1, 1, Lenght('KEYKODE')+1) = 'KEYCODE ' then Begin
                        varKeyCode:=copy(S, Lenght('KEYKODE')+1, 255);
                        Continue
                End;
                [  scip about other KeyCodes =)  ]

                WriteLN('Error in configuration file =) ');
        End;

------------------------------------------------------------------------------
Q:>  2.5.5.1  Как обрабатывать INCLUDE?

A:>  А в чем  проблема, собственно? Просто предыдущий кусок кода выполняется
     в виде процедуры, которая вызывается рекурсивно при нахождении слова
     'INCLUDE'

------------------------------------------------------------------------------
Q:>  2.5.6  Как дописать в конец .exe-файла?

A:>  Так же как и в любой дpугой файл. см Seek и FileSize в хелпе.

------------------------------------------------------------------------------
Q:>  2.5.6.1  свою программу?

A:>  Так же как и любую другую информацию =)

     Ах, вам нужно, небось, чтоб она ещё и управление  получала? Тогда
     огорчу: здесь не пункт подготовки вирус описателей, которые не знают
     даже как заголовок .exe переправить. Читайте книжки и доки - они
     рулез. А когда начнёте все понимать - может и вирусы писать не
     захотите =)

------------------------------------------------------------------------------
Q:>  2.5.6.2  свои настройки, как это делает сам BP/TP

A:>  Дописывать их также. Append'ом. А чтобы перезаписывать и читать нужно
     знать оригинальную длину файла. Или просто помнить сколько байтов вы
     дописывали и читать их, что гораздо проще вычисления ординальной длинны.
     Примеры - на DzeServer'е.

Секция 2 из 2 - Предыдущая - Следующая



  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте