Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


LZExpand.pas (ru) от ТиХАРиКа


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВт, 28-Авг-2007 14:33    Заголовок сообщения: LZExpand.pas (ru) от ТиХАРиКа
Цитата

delphi:
  1. {*******************************************************}
  2. {                                                       }
  3. {       Borland Delphi Run-time Library                 }
  4. {       Win32 LZ compression Interface Unit             }
  5. {                                                       }
  6. {       Copyright (c) 1985-1999, Microsoft Corporation  }
  7. {                                                       }
  8. {       Translator: Borland Software Corporation        }
  9. {                                                       }
  10. {*******************************************************}
  11. {                                                       }
  12. {  Русский перевод функций LZ32.DLL                     }
  13. {    С дополнительной справкой по использованию         }
  14. {     Подготовил Евгений Ч. a.k.a. TuXAPuK              }
  15. {        Эксклюзивно для Форума Чертёнка.ру             }
  16. {            http://forum.chertenok.ru/                 }
  17. {              tuxapuk CИМВОЛ@ yandex.ru                }
  18. {                                                       }
  19. {                       Codepage : Windows-1251 Cyrilic }
  20. {*******************************************************}
  21.  
  22. { -- THIS COMMENT CAN BE REMOVED --
  23.   Библиотека Lempel-Ziv от Microsoft была создана со времён Windows 3.1
  24.    http://msdn2.microsoft.com/en-us/library/aa363901.aspx
  25.   Предназначалась для установщиков програмного обеспечения на клиентский комп.
  26.     Вы наверно часто замечали файлы которые называются PROGRAM.EX_ или
  27.   LIBRARY.DL_ которые не хотят открываться пока мы не запустите злобный
  28.   Майкрасофт инсталлер... Ну так вот.. Всё изза того что они были запакованы
  29.   программкой COMPRESS.EXE..
  30.    Microsoft (R) File Compression Utility  Version 2.00
  31.    Copyright (C) Microsoft Corp. 1990-1992.  All rights reserved.
  32.     А знаете почему со времён 1992-го года Microsoft не отказалась
  33.   от этой технологии, и даже создала более новую версию библиотеки распаковщика?
  34.   WINDOWS 3.x, 9x, и семейство старых NT           : LZExpand.dll
  35.   WINDOWS NT 5.* (Он-же Windows-2000, XP, И пр.)  : LZ32.dll
  36.   XP64bit, Vista                                  : LZ64.dll
  37.     Да потому что сама библиотека работает очень быстро фактически на уровне
  38.   железа, и не чего для себя особенного не требует...
  39.   А самое главное что эта библиотека не только может распаковывать.
  40.   Но ещё и просто копировать файл... И многие программисты вместо того что-бы
  41.   писать копирование файла берут эту функцию и тупо вставляют в свой код.
  42.   // Взято с интернета Автор к сожелению не известен.
  43.   uses LZExpand;
  44.   ......
  45.   Procedure CopyFile(Source, Dest: string);
  46.   Var
  47.     SrcFile: Integer;
  48.     DestFile: Integer;
  49.     S: string;
  50.     RetCode: Longint;
  51.     OpenFileBuf: TOFStruct;
  52.     FName: array[0..255] of Char;
  53.   begin
  54.     StrPCopy(FName, Source);
  55.     SrcFile := LZOpenFile(FName, OpenFileBuf, of_Read);
  56.     StrPCopy(FName, Dest);
  57.     DestFile := LZOpenFile(FName, OpenFileBuf, of_Create);
  58.     RetCode := LZCopy(SrcFile, DestFile);
  59.     if RetCode >= 0 then
  60.     begin
  61.       LZClose(SrcFile);
  62.       LZClose(DestFile);
  63.     end
  64.     else
  65.     begin
  66.       Str(RetCode, S);
  67.       MessageDlg('Не могу скопировать ' + Source + ' в ' +
  68.       Dest + #13 + 'Код ошибки = ' + S, mtError, [mbOk], 0);
  69.     end;
  70.   end;
  71.     Лично я пользуюсь этой библиотекой что-бы распаковать HTML страницы
  72.   на своём сайте. Пользовать заливает свою страничку, она запаковывается
  73.   с помощью MSCOMPRESS (Unix аналог COMPRESS.EXE) а потом по просьбе PHP
  74.   распаковывается в STDOUT буфер с помощью MSEXPAND (Unix аналог EXPAND.EXE)...
  75.     Самое удивительное что HTML файлы которые весят по 40Kb превращаются в
  76.   ласковых овечек по 12Kb а то и меньше... Мне радость - экономия места,
  77.   юзерам радость - что места много, а хакерам большой Х... Потому что всё что
  78.   они загрузили превращается в звёздочки кружочки и.т.п. дребедень...
  79.     Хочу особенно заметить что функции этого модуля предназначены только для
  80.   распаковки... Можете не пытаться придумывать злобные алгоритмы что-бы
  81.   что нибуть сжать через LZ*.dll
  82.   Удачного освоения новичкам, и лечения от склероза дедушкам....
  83. Скачать запаковщик можно :
  84.   или
  85. Легче поискать у себя на диске :
  86.   Есле вы начали всё это читать зачет у вас установлен
  87.   язык программирования для Windows платформы.
  88.   А значит скорее всего есть Microsoft Resource Kit
  89.   При создании этой статьи/справки мне помогали...
  90.    50%  = Borland C++ Version 3.11 for Windows Help
  91.    30%  = Microsoft MSDN Site
  92.    20%  = Гугл.com
  93. }
  94.  
  95. unit LZExpand;
  96.  
  97. {$WEAKPACKAGEUNIT}
  98.  
  99. {$HPPEMIT '#include <lzexpand.h>'}
  100.  
  101. interface
  102.  
  103. uses Windows;
  104.  
  105. { Коды ошибок }
  106. const
  107.   {$EXTERNALSYM LZERROR_BADINHANDLE}
  108.   LZERROR_BADINHANDLE = -1;         { Неправильный входящий заголовок (далее. хэндл) }
  109.   {$EXTERNALSYM LZERROR_BADOUTHANDLE}
  110.   LZERROR_BADOUTHANDLE = -2;        { Неправельный исходящий хэндл }
  111.   {$EXTERNALSYM LZERROR_READ}
  112.   LZERROR_READ = -3;                { Неисправный компрессированный формат }
  113.   {$EXTERNALSYM LZERROR_WRITE}
  114.   LZERROR_WRITE = -4;               { Не хватает места для исходящего файла }
  115.   {$EXTERNALSYM LZERROR_GLOBALLOC}
  116.   LZERROR_GLOBALLOC = -5;           { Не хватает оперативной памяти для структуры LZFile }
  117.   {$EXTERNALSYM LZERROR_GLOBLOCK}
  118.   LZERROR_GLOBLOCK = -6;            { Неправельный глобальный заголовок }
  119.   {$EXTERNALSYM LZERROR_BADVALUE}
  120.   LZERROR_BADVALUE = -7;            { Значение находится вне возможных значений }
  121.   {$EXTERNALSYM LZERROR_UNKNOWNALG}
  122.   LZERROR_UNKNOWNALG = -8;          { Алгоритм сжатия не определен }
  123.  
  124.  
  125. { Prototypes }
  126.  
  127. {$EXTERNALSYM LZCopy}
  128. function LZCopy(Source, Dest: Integer): Longint; stdcall;
  129. {
  130. Скопировать все данные из Source в Dest
  131. функция LZCopy(ХэндлИз, ХэндлКуда):
  132.    - ХэндлИз      : Из какого хранилища данных брать данные
  133.    - ХэндлКуда    : В какое хранилище помещать те данные
  134.    - Резултат     : Количество данных в ХэндлКуда (>=0) или код ошибки (<0)
  135.                     - LZERROR_BADINHANDLE
  136.                     - LZERROR_BADOUTHANDLE
  137.                     - LZERROR_GLOBALLOC
  138.                     - LZERROR_GLOBLOCK
  139.                     - LZERROR_READ
  140. }
  141. {$EXTERNALSYM LZInit}
  142. function LZInit(Source: Integer): Integer; stdcall;
  143. {
  144. Переделать хэндл в LZ77 хэндл.
  145. Очень удобная функция если архив лежит скажем в ресурсе программы.
  146.    Пример :
  147.     MyLZFile := LZInit(MyStream.Handle);               // TStream
  148.     MyLZFile := LZInit(GetStdHandle(STD_INPUT_HANDLE)) // STDIN в консольной программе
  149.   PS :
  150.     Закрыв заголовок LZ77 - LZClose, не забудте закрыть заголовок TStream.Free;
  151. функция LZInit(Хэндл):
  152.    - Хэндл        : Хэндл любого хранилища данных
  153.    - Резултат     : Новый хэндл LZ77 файла (>=0) или код ошибки (<0)
  154.                     - LZERROR_BADINHANDLE
  155.                     - LZERROR_GLOBALLOC
  156.                     - LZERROR_GLOBLOCK
  157.                     - LZERROR_UNKNOWNALG
  158. }
  159. {$EXTERNALSYM GetExpandedName}
  160. function GetExpandedName(Source, Buffer: PChar): Integer; stdcall;
  161. {$EXTERNALSYM GetExpandedNameA}
  162. function GetExpandedNameA(Source, Buffer: PAnsiChar): Integer; stdcall;
  163. {$EXTERNALSYM GetExpandedNameW}
  164. function GetExpandedNameW(Source, Buffer: PWideChar): Integer; stdcall;
  165. {
  166. Восстановить оригенальное имя файла
  167. Если было правельно сжато...
  168.    Пример :
  169.       Файл    MYPROGRAM.ZI_
  170.       вернёт  MYPROG~1.ZIP
  171. Так как функция существует со времён Windows 3.11
  172.       То и имя файл будет в виде 8.3 (8 знаков точка 3 знака)
  173. функция GetExpandedName,GetExpandedNameA,GetExpandedNameW(ИмяФайла, Буффер):
  174.    - ИмяФайла     : Имя файла архива PChar
  175.    - Буффер       : Туда будет помещено обычное имя
  176.    - Резултат     : Возвращает 1 если всё правильно или код ошибки.
  177.                     - LZERROR_BADVALUE
  178. }
  179. {$EXTERNALSYM LZOpenFile}
  180. function LZOpenFile(Filename: PChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
  181. {$EXTERNALSYM LZOpenFileA}
  182. function LZOpenFileA(Filename: PAnsiChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
  183. {$EXTERNALSYM LZOpenFileW}
  184. function LZOpenFileW(Filename: PWideChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
  185. {
  186. Открыть файл LZ77
  187. функция LZOpenFile,LZOpenFileA,LZOpenFileW(ИмяФайла, СтатусФайла, ОткрываемДля):
  188.    - ИмяФайла     : Имя файла который нужно будет прочесть,создать,и.п.т.
  189.    - СтатусФайла  : Переменная из Windows.pas
  190.                     TOFStruct содержит
  191.                       cBytes: Byte;
  192.                       fFixedDisk: Byte;
  193.                       nErrCode: Word;
  194.                       Reserved1: Word;
  195.                       Reserved2: Word;
  196.                       szPathName: array[0..OFS_MAXPATHNAME-1] of CHAR;
  197.    - ОткрываемДля : Обчный режим открытия файла
  198.                     - OF_CANCEL           = Исползуется только в 16ти битных виндах
  199.                     - OF_CREATE           = Создаст новый файл. Если существует - то обнулит его.
  200.                     - OF_DELETE           = Удалит файл
  201.                     - OF_EXIST            = Откроет из закроет файл. Что-бы проверить его существование.
  202.                     - OF_PARSE            = Просто сольёт инфу в TOFStruct и закроет файл
  203.                     - OF_PROMPT           = Интересный параметр. Если файла нету открывает диалог [Retry] [Cancel]
  204.                                             Если пользователь нажмёт Cancel то LZOpenFile вернёт ошибку открытия файла...
  205.                     - OF_READ             = Открыть файл только для чтения.
  206.                     - OF_READWRITE        = Откроет файл для чтения и для записи.
  207.                     - OF_REOPEN           = Так и не понял для чего.
  208.                                             Из справки Borlad C++ 3.1
  209.                                             Opens the file using information in the reopen buffer.
  210.                     - OF_SHARE_DENY_NONE  = Не даст другим процессам доступа к чтению или записи этому файлу пока не освободится хэндл
  211.                     - OF_SHARE_DENY_READ  = Не даст другим файлам доступ на чтение к этому файлу пока не освободится хэндл
  212.                     - OF_SHARE_DENY_WRITE = Не даст другим файлам доступ на запись к этому файлу пока не освободится хэндл
  213.                     - OF_SHARE_EXCLUSIVE  = Не даст другим процессам доступа к чтению и записи этому файлу пока не освободится хэндл
  214.                     - OF_WRITE            = Откроет файл для записи.
  215.    - Резултат     : Возвращает хэндл файла (>=0) или код ошибки (<0)
  216.                     - LZERROR_BADINHANDLE
  217.                     - LZERROR_GLOBALLOC
  218. }
  219.  
  220. {$EXTERNALSYM LZSeek}
  221. function LZSeek(hFile: Integer; Offset: Longint; Origin: Integer): Longint; stdcall;
  222. {
  223. Сдвиг курсора в LZ77...
  224. Функция LZSeek(Файл, Сдвиг, НачалоСдвига)
  225.    - Файл         : Хэндл файла полученый из LZOpenFile
  226.    - Сдвиг        : В какую точку файла делать сдвиг
  227.    - НачалоСдвига : От куда наченать сдвиг
  228.                     - $0000 = С начала файла
  229.                     - $0001 = С позиции курсора
  230.                     - $0002 = С конца файла
  231.    - Резултат     : Возвращает позицию курсора (>=0) или код ошибки (<0)
  232.                     - LZERROR_BADINHANDLE
  233.                     - LZERROR_BADVALUE
  234.                     - LZERROR_GLOBLOCK
  235. PS: Так как узнать размер будоющего фаила средствами делфи у меня не получилось
  236.      Пришлось выдумать альтернативу...
  237.      iExtractedSize := LZSeek(hFile, 0, 2); // Передвинуть курсор в самый конец файла и получить размер.
  238. }
  239. {$EXTERNALSYM LZRead}
  240. function LZRead(hFile: Integer; Buffer: LPSTR; Count: Integer): Integer; stdcall;
  241. {
  242. Чтение данных файла LZ77...
  243. Функция LZRead(Файл, Буффер,БайтЧитать)
  244.    - Файл         : Хэндл файла полученый из LZOpenFile
  245.    - Буффер       : PChar буффер куда будут скидываться данные
  246.                     - Лучше всего подходит
  247.                     - Var Buffer: Array[0..1023] Of Char;
  248.    -              : Сколько байт нужно прочесть из файла
  249.                     - Лучше всего подходит
  250.                     - sizeof(Buffer)
  251.    - Резултат     : Количество прочитанных байт из файла (>=0) или код ошибки (<0)
  252.                     - LZERROR_BADINHANDLE
  253.                     - LZERROR_BADOUTHANDLE
  254.                     - LZERROR_BADVALUE
  255.                     - LZERROR_GLOBALLOC
  256.                     - LZERROR_GLOBLOCK
  257.                     - LZERROR_READ
  258.                     - LZERROR_WRITE
  259. }
  260. {$EXTERNALSYM LZClose}
  261. procedure LZClose(hFile: Integer); stdcall;
  262. {
  263. Закрытие файла LZ77...
  264. Процедура LZClose(Файл)
  265.    - Файл         : Хэндл файла полученый из LZOpenFile
  266. }
  267.  
  268. implementation
  269.  
  270. // Привязывание функций к dll в которой они лежат.
  271. //  Ведь не обезательно ей называться 'LZ32.DLL'
  272. //  Вы ведь можете переименовать длл-ку в MYEXCLUSIVE.UNPACKER
  273. //  И закинуть её в папку с проэктом...
  274. const lz32 = 'LZ32.DLL';
  275. function GetExpandedName;    external lz32 name 'GetExpandedNameA';
  276. function GetExpandedNameA;   external lz32 name 'GetExpandedNameA';
  277. function GetExpandedNameW;   external lz32 name 'GetExpandedNameW';
  278. procedure LZClose;           external lz32 name 'LZClose';
  279. function LZCopy;             external lz32 name 'LZCopy';
  280. function LZInit;             external lz32 name 'LZInit';
  281. function LZOpenFile;         external lz32 name 'LZOpenFileA';
  282. function LZOpenFileA;        external lz32 name 'LZOpenFileA';
  283. function LZOpenFileW;        external lz32 name 'LZOpenFileW';
  284. function LZRead;             external lz32 name 'LZRead';
  285. function LZSeek;             external lz32 name 'LZSeek';
  286.  
  287. end.



PS : Дедушки... За склероз не бейте.. А если где ошибся поправте меня пожалуйста...

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100