Добро пожаловать, гость ( Вход | Регистрация )
| -=CHE@TER=- |
Jan 5 2007, 00:35
Сообщение
#1
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,402 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 325 раз(а) |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
| -=CHE@TER=- |
Nov 27 2013, 15:42
Сообщение
#2
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,402 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 325 раз(а) |
Недавно я тут писал про утилиту COMPRESS.EXE, сжимающую файлы.
Конечно, сжатие весьма посредственное (мы сейчас рассматриваем классический алгоритм LZSS, а не MS-ZIP, который туда добавили позже) и хорошо жмёт только файлы где есть длинные последовательности из повторяющихся байт, но в общем и целом для некоторых вещей вполне себе подойдёт. Тут главный плюс в том, что распаковщик короткий, легко пишется и не требует дополнительной памяти (ну 4 Кб на циклический буфер - это крохи). Так что можно использовать этот архиватор и созданные им файлы для своих нужд. Но, для начала, давайте взглянем на то, как сжатые файлы создаются. Итак, делаем: COMPRESS.EXE FILENAME.EXT FILENAME.EX_ Что происходит после выполнения этой команды? 1) Создаётся файл FILENAME.EX_ 2) Туда пишется следующий заголовок: CODE CHAR[8] - signature "SZDD\x88\xF0\x27\x33" CHAR - compression algo type - always 'A' (0x41) CHAR - last char of uncompressed file name (example: "test.xyz" -> 'z'); may be null DWORD - unpacked file size Итого, заголовок у нас занимает 14 байт. Отдельно хочу сделать замечание по поводу поля "algo type" (алгоритм сжатия). Если кто-то видел в Интернете исходные коды Windows 2000, то там можно было увидеть такое: CODE #define ALG_FIRST ((BYTE) 'A') // first version algorithm label for Lempel-Ziv #define ALG_LZ ((BYTE) 'B') // new Lempel-Ziv algorithm label #define ALG_LZA ((BYTE) 'C') // Lempel-Ziv with arithmetic encoding algorithm label Однако, сразу после этого шёл define объявлявший валидным только первый алгоритм. Так что на практике первые два поля в заголовке архива - константы и можно смело проверять даже не 8, а первые 9 байт. Поле "last char" утилитой EXPAND.EXE тоже не используется, а COMPRESS.EXE пишет туда ноль (или я так и не понял, как сделать, чтобы оно работало). Так что его можно игнорировать, если, конечно, вы сами не создавали архив и сами же его не распаковываете (точно зная, что поле не пустое). Далее идёт размер распакованного файла и всё. Хочу обратить на это внимание - в архиве нигде не содержится размер сжатых данных - файл читается, пока размер распакованного буфера не достигнет размера распакованного файла из заголовка. 3) В файл пишется упакованное содержимое. 4) Файлу-архиву ставится дата исходного файла - таким "оригинальным образом" в Microsoft сохраняют дату создания файла. Поясню: при распаковке извлечённому файлу выставляется (восстанавливается) дата с файла-архива. Ну вот, теперь мы знаем как это работает и устроено, так что можем делать архивы, линковать в ресурсы к своим программам и "на лету" распаковывать. Вот небольшой код на Delphi делающий распаковку (я переписал его с Си - см. ссылку). Вызывать так: MSLZSSExpandBuff(PackedBuffer, UnpackedBuffer, PackedBufferSize, UnpackedBufferSize); CODE { ported from: http://gnuwin32.sourceforge.net/packages/mscompress.htm } Function MSLZSSGetByte(Var P: Pointer; Var Ps: DWORD): Integer; Begin If Ps > 0 Then Begin result:=Byte(P^); Ps:=Ps - 1; Inc(DWORD(P)); End Else result:=-1; End; Function MSLZSSPutByte(Var U: Pointer; Var Us: DWORD; B: Byte): Boolean; Begin result:=(Us > 0); If result Then Begin Byte(U^):=B; Us:=Us - 1; Inc(DWORD(U)); End; End; Procedure MSLZSSExpandBuff(P, U: Pointer; Ps, Us: DWORD); Var I, J, Len, M, B: Integer; Buff: Array[0..$FFF] Of Byte; Begin FillChar(buff[0], $FFF + 1, 32); I:=($FFF + 1) - 16; While ((Ps > 0) And (Us > 0)) Do Begin B:=MSLZSSGetByte(P, Ps); If B = -1 Then Break; For M:=0 To 7 Do Begin If (B And 1) = 0 Then Begin J:=MSLZSSGetByte(P, Ps); If J = -1 Then Break; Len:=MSLZSSGetByte(P, Ps); If Len = -1 Then Break; J:=J + ((Len And $F0) ShL 4); Len:=(Len And $0F) + 3; While Len > 0 Do Begin Buff[I]:=Buff[J]; If MSLZSSPutByte(U, Us, Buff[I]) = False Then Break; J:=(J + 1) And $FFF; I:=(I + 1) And $FFF; Len:=Len - 1; End; End Else Begin J:=MSLZSSGetByte(P, Ps); If J = -1 Then Break; Buff[I]:=J; If MSLZSSPutByte(U, Us, Buff[I]) = False Then Break; I:=(I + 1) And $FFF; End; B:=B ShR 1; End; // For End; // While End; Спасибо сказали:
|
-=CHE@TER=- Delphi, Asm, C, WinAPI, PHP, ... Jan 5 2007, 00:35
Siberian GRemlin Может не в тему, но не решился создавать новую тем... Jul 5 2007, 16:36
-=CHE@TER=- Может не в тему, но не решился создавать новую тем... Jul 5 2007, 16:44
-=CHE@TER=- Вопрос - кто знает, как по MUTEX'у процесса по... Jul 7 2007, 16:37
jTommy Вопрос - кто знает, как по MUTEX'у процесса по... Jul 8 2007, 16:01
-=CHE@TER=- Если я правильно понял ситуация такая: загружена т... Jul 9 2007, 12:10
jTommy Нет, всё гораздо хуже - программа при загрузке ком... Jul 9 2007, 20:09
-=CHE@TER=- Нет, всё гораздо хуже - программа при загрузке ком... Aug 22 2014, 11:14
Xplorer Handle'у процесса посылал WM_CLOSE - без толку... Jul 10 2007, 09:44
-=CHE@TER=- Бардак на корабле! © Попугай из Пиратов Карибс... Jul 10 2007, 12:51
Xplorer Я изменил код.
А вот, кстати, интересный тогда вп... Jul 10 2007, 13:54
-=CHE@TER=- Я изменил код.
Смотри в коде.Хе-хе, ты своё сообщ... Jul 10 2007, 22:04
-=CHE@TER=- Думаю, тут будет полезно приводить некоторые полез... Jul 16 2007, 16:40
Siberian GRemlin Извиняюсь, если не в тему (вроде это WinAPI). Хоте... Jul 19 2007, 09:14
-=CHE@TER=- Извиняюсь, если не в тему (вроде это WinAP). Хотел... Jul 19 2007, 13:51
-=CHE@TER=- А теперь моя очередь задавать вопрос. (*улыбается*... Jul 20 2007, 01:30
Xplorer Для 2000/XP/2003/Vista - RasGetConnectionStatistic... Jul 20 2007, 06:08
-=CHE@TER=- Xplorer!
RasGetConnectionStatistics - это как ... Jul 20 2007, 13:48
-=CHE@TER=- [b]Xplorer!
RasGetConnectionStatistics - это к... Jul 21 2010, 16:00
-=CHE@TER=- Переименовал тему - теперь тут можете обсуждать чт... Jul 23 2007, 19:01
-=CHE@TER=- Кстати, насчёт ReadKey / KeyPressed - вот, неплоха... Aug 11 2007, 13:54
-=CHE@TER=- Вопрос ко всем - возможно ли при помощи класса TFi... Apr 7 2008, 17:03
Xplorer S := TFileStream.Create('x.x', fmO... Apr 8 2008, 19:30
-=CHE@TER=- Xplorer!
Ой, спасибо большое!
Что-то я сто... Apr 9 2008, 10:09
-=CHE@TER=- Ещё пара глупых вопросов:
1. В Си можно сделать т... Jun 8 2008, 11:49
Grom PE -=CHE@TER=-, вопросы нормальные =)
1. Если я прав... Jun 8 2008, 12:28
-=CHE@TER=- Grom PE!
Спасибо большое, только создавать ещё... Jun 8 2008, 17:59
-=CHE@TER=- Небольшая программка для перезапуска зависших прил... Oct 12 2008, 19:56
-=CHE@TER=- Вопрос: кто-нибудь знает как получить ключи команд... Oct 13 2008, 08:16
-=CHE@TER=- Вот код тру перезапускалки:
Program WHungApp;
Us... Oct 13 2008, 10:55
-=CHE@TER=- PHP 5.2.1 + IIS 6
PHP has encountered an Access V... Oct 18 2008, 11:15
-=CHE@TER=- Очередная херня - столько времени убил, пока нагуг... Oct 31 2008, 15:54
-=CHE@TER=- Есть на форме UpDown1, ассоциированный (Associate)... Nov 15 2008, 07:32
Grom PE -=CHE@TER=-,
у меня с чистым созданным проектом вс... Nov 15 2008, 12:58
-=CHE@TER=- Еще попробуй перезапустить Delphi.Как оно всё оказ... Nov 15 2008, 13:08
-=CHE@TER=- Вопрос сложный, но может кто-то знает в чём прикол... Dec 18 2008, 18:26
-=CHE@TER=- Делал тут как-то плеер. И решил сделать для него в... Jan 2 2009, 19:53
-=CHE@TER=- Кто-нибудь знает, как можно проверить сокет на дох... Jun 25 2009, 04:10
-=CHE@TER=- Однако! Первая строчка с получением 0 байт у м... Dec 5 2009, 16:36
Siberian GRemlin Обычно указывается драйвер вызвавший эту ошибку. Е... Jun 25 2009, 06:22
-=CHE@TER=- Обычно указывается драйвер вызвавший эту ошибку. Е... Jun 25 2009, 11:56
Siberian GRemlin Полезную статейку нашёл. Даже если ошибка на чужом... Nov 2 2009, 10:11
-=CHE@TER=- Товарищи, объясните мне кто-нибудь такой феномен:
... Jan 15 2010, 19:26
Grom PE -=CHE@TER=-
Ну дык, процессор так работает, x shr... Jan 16 2010, 07:46
-=CHE@TER=- Думаю, что это лучше здесь разместить, чем в ссылк... Jan 23 2010, 18:35
Siberian GRemlin Может не в тему, но есть ли готовый модуль\би... Feb 15 2010, 15:45
Axsis пара ссылок с первой страницы гугла:
http://www.de... Feb 15 2010, 16:10
-=CHE@TER=- Чтобы долго не писать чего да как - приведу [/cut]... Apr 22 2010, 10:05
-=CHE@TER=- Иногда бывает надо при распаковке игровых архивов ... Jun 1 2010, 17:46
-=CHE@TER=- Блин, ставил по работе на удалённый сайт Joomla - ... Jul 27 2010, 17:38
-=CHE@TER=- Вчерась ковырял одну игрушку, где данные были упак... Aug 10 2010, 14:27
-=CHE@TER=- Вчерась ковырял одну игрушку, где данные были упак... Mar 7 2012, 20:37
Siberian GRemlin Сегодня у меня был очередной сеанс мозгофилии.
При... Jan 7 2011, 15:20
-=CHE@TER=- 1) Либо Inno: AnsiString -> WideString; Delphi:... Jan 7 2011, 23:20
Siberian GRemlin Собственно, я и спрашивал как правильно перегнать ... Jan 8 2011, 10:49
-=CHE@TER=- Locale - это, грубо так говоря, язык установленный... Jan 8 2011, 12:35
-=CHE@TER=- Ковырял тут по просьбе CMS одну. Собственно, были ... Jan 9 2011, 16:01
Siberian GRemlin Не подскажите ка можно на JavaScript вставить (гип... Apr 14 2011, 16:49
-=CHE@TER=- Если тебе просто что-то надо вставить, а не файл, ... Apr 14 2011, 18:26
Siberian GRemlin Мне нужно было именно на JS или jQ, ибо для AJAX н... Apr 15 2011, 11:12
-=CHE@TER=- Поставил я тут новый colorer для FAR и моя тачка з... Jul 23 2011, 13:01
Siberian GRemlin Намедни столкнулся с тем что IE не понимает InnerH... Jul 28 2011, 03:05
-=CHE@TER=- У Delphi такой смешной оптимизатор (компилирую про... Nov 11 2011, 15:15
-=CHE@TER=- Siberian GRemlin!
До меня, кажется, дошло, по... Nov 14 2011, 13:41
-=CHE@TER=- У Delphi такой смешной оптимизатор (компилирую про... Mar 12 2012, 09:13
Siberian GRemlin для каждой строки писать String[кол-во_символов] =... Mar 12 2012, 11:07
Siberian GRemlin Как я понимаю при конкатенации (дурацкое слово) ст... Nov 11 2011, 15:25
-=CHE@TER=- Похоже долго ты на Java писал. (*улыбается*)
Нет,... Nov 11 2011, 20:39
-=CHE@TER=- Писал я недавно патч для включения крови в German ... Jan 14 2012, 13:26
Siberian GRemlin Кто-нибудь знает где можно взять готовый код под P... Mar 24 2012, 09:13
-=CHE@TER=- Вот тут (за номером 7 самый простой, и ниже - до к... Mar 24 2012, 11:58
-=CHE@TER=- В Си есть такая замечательная функция, как sprintf... Apr 14 2012, 15:39
-=CHE@TER=- И ещё о нескольких устаревших (по мнению MSDN, где... Apr 15 2012, 10:32
-=CHE@TER=- Проводя очередную чистку системы, натолкнулся на ф... Apr 19 2012, 13:23
Grom PE Сам у себя встречал такие файлы. Полюбопытствовал,... Apr 19 2012, 19:05
-=CHE@TER=- В очередной раз зайдя на сайт товарища Siberian GR... Apr 24 2012, 12:14
Siberian GRemlin Я так понимаю, ты знаешь способ создания динамичны... Apr 24 2012, 13:16
-=CHE@TER=- Я так понимаю, ты знаешь способ создания динамичны... Apr 24 2012, 15:37
Siberian GRemlin Месяц назад я только договорился с админом и мне в... Apr 24 2012, 15:49
-=CHE@TER=- О, блин, 4-ый PHP это уже здорово, чем вообще ниче... Apr 24 2012, 16:19
-=CHE@TER=- Нашёл в Delphi 7 охрененный косяк, который вынес м... May 30 2012, 10:22
-=CHE@TER=- Все, наверное, помнят, что в .BMP формате строки и... Sep 6 2012, 20:32
jTommy Ради интереса полез в свою "библию" - кн... Sep 8 2012, 20:52
-=CHE@TER=- Ты имеешь ввиду GFF?
Я нашёл там вот такое описани... Sep 9 2012, 12:43
jTommy Да, она самая, издание от 1997 года. Sep 9 2012, 21:25
-=CHE@TER=- Поделюсь двумя вещами.
1) Во-первых, в Delphi 7 к... Dec 15 2012, 09:29
-=CHE@TER=- Товарищи, у меня вопрос - может кто-нибудь помочь?... Apr 6 2013, 18:25
-=CHE@TER=- Нашёл вот такую штуку:
Это из исходных кодов ста... Apr 9 2013, 16:17
-=CHE@TER=- Исходные коды можно нагуглить, могу выложить, если... Apr 18 2013, 16:48
-=CHE@TER=- Я, походу, перестану скоро Delphi пользоваться, во... Apr 27 2013, 15:06
Siberian GRemlin Моя прога по работе использует TTimer и пока пробл... Apr 29 2013, 13:48
-=CHE@TER=- P. S. С получением текста помочь не могу, к сожале... Apr 30 2013, 11:40
-=CHE@TER=- Ну, ладно, пока никто с получением текста не помог... May 1 2013, 11:54
-=CHE@TER=- Сделал себе замечательный srvrun.bat для перезапус... Jun 6 2013, 17:11
Siberian GRemlin Возникла внезапная потребность использовать socks ... Jun 22 2013, 08:06
-=CHE@TER=- Мне не так давно было ещё одно откровение, которым... Jun 28 2013, 11:09
-=CHE@TER=- Часто пишу программы, которые со временем довольно... Sep 14 2013, 14:32
-=CHE@TER=- Пишу в последнее время на Си, так что недавно мне ... Nov 23 2013, 17:38
-=CHE@TER=- Натолкнулся на то, что в нескольких играх использу... Feb 13 2014, 14:49![]() ![]() |
| Упрощённая версия | Сейчас: 7th December 2025 - 23:15 |