{*******************************************************}
{ }
{ Borland Delphi Run-time Library }
{ Win32 LZ compression Interface Unit }
{ }
{ Copyright (c) 1985-1999, Microsoft Corporation }
{ }
{ Translator: Borland Software Corporation }
{ }
{*******************************************************}
{ }
{ Русский перевод функций LZ32.DLL }
{ С дополнительной справкой по использованию }
{ Подготовил Евгений Ч. a.k.a. TuXAPuK }
{ Эксклюзивно для Форума Чертёнка.ру }
{ tuxapuk CИМВОЛ@ yandex.ru }
{ }
{ Codepage : Windows-1251 Cyrilic }
{*******************************************************}
{ -- THIS COMMENT CAN BE REMOVED --
Библиотека Lempel-Ziv от Microsoft была создана со времён Windows 3.1
http://msdn2.microsoft.com/en-us/library/aa363901.aspx
Предназначалась для установщиков програмного обеспечения на клиентский комп.
Вы наверно часто замечали файлы которые называются PROGRAM.EX_ или
LIBRARY.DL_ которые не хотят открываться пока мы не запустите злобный
Майкрасофт инсталлер... Ну так вот.. Всё изза того что они были запакованы
программкой COMPRESS.EXE..
Microsoft (R) File Compression Utility Version 2.00
Copyright (C) Microsoft Corp. 1990-1992. All rights reserved.
А знаете почему со времён 1992-го года Microsoft не отказалась
от этой технологии, и даже создала более новую версию библиотеки распаковщика?
WINDOWS 3.x, 9x, и семейство старых NT : LZExpand.dll
WINDOWS NT 5.* (Он-же Windows-2000, XP, И пр.) : LZ32.dll
XP64bit, Vista : LZ64.dll
Да потому что сама библиотека работает очень быстро фактически на уровне
железа, и не чего для себя особенного не требует...
А самое главное что эта библиотека не только может распаковывать.
Но ещё и просто копировать файл... И многие программисты вместо того что-бы
писать копирование файла берут эту функцию и тупо вставляют в свой код.
// Взято с интернета Автор к сожелению не известен.
uses LZExpand;
......
Procedure CopyFile(Source, Dest: string);
Var
SrcFile: Integer;
DestFile: Integer;
S: string;
RetCode: Longint;
OpenFileBuf: TOFStruct;
FName: array[0..255] of Char;
begin
StrPCopy(FName, Source);
SrcFile := LZOpenFile(FName, OpenFileBuf, of_Read);
StrPCopy(FName, Dest);
DestFile := LZOpenFile(FName, OpenFileBuf, of_Create);
RetCode := LZCopy(SrcFile, DestFile);
if RetCode >= 0 then
begin
LZClose(SrcFile);
LZClose(DestFile);
end
else
begin
Str(RetCode, S);
MessageDlg('Не могу скопировать ' + Source + ' в ' +
Dest + #13 + 'Код ошибки = ' + S, mtError, [mbOk], 0);
end;
end;
Лично я пользуюсь этой библиотекой что-бы распаковать HTML страницы
на своём сайте. Пользовать заливает свою страничку, она запаковывается
с помощью MSCOMPRESS (Unix аналог COMPRESS.EXE) а потом по просьбе PHP
распаковывается в STDOUT буфер с помощью MSEXPAND (Unix аналог EXPAND.EXE)...
Самое удивительное что HTML файлы которые весят по 40Kb превращаются в
ласковых овечек по 12Kb а то и меньше... Мне радость - экономия места,
юзерам радость - что места много, а хакерам большой Х... Потому что всё что
они загрузили превращается в звёздочки кружочки и.т.п. дребедень...
Хочу особенно заметить что функции этого модуля предназначены только для
распаковки... Можете не пытаться придумывать злобные алгоритмы что-бы
что нибуть сжать через LZ*.dll
Удачного освоения новичкам, и лечения от склероза дедушкам....
Скачать запаковщик можно :
или
Легче поискать у себя на диске :
Есле вы начали всё это читать зачет у вас установлен
язык программирования для Windows платформы.
А значит скорее всего есть Microsoft Resource Kit
При создании этой статьи/справки мне помогали...
50% = Borland C++ Version 3.11 for Windows Help
30% = Microsoft MSDN Site
20% = Гугл.com
}
unit LZExpand;
{$WEAKPACKAGEUNIT}
{$HPPEMIT '#include <lzexpand.h>'}
interface
uses Windows;
{ Коды ошибок }
const
{$EXTERNALSYM LZERROR_BADINHANDLE}
LZERROR_BADINHANDLE = -1; { Неправильный входящий заголовок (далее. хэндл) }
{$EXTERNALSYM LZERROR_BADOUTHANDLE}
LZERROR_BADOUTHANDLE = -2; { Неправельный исходящий хэндл }
{$EXTERNALSYM LZERROR_READ}
LZERROR_READ = -3; { Неисправный компрессированный формат }
{$EXTERNALSYM LZERROR_WRITE}
LZERROR_WRITE = -4; { Не хватает места для исходящего файла }
{$EXTERNALSYM LZERROR_GLOBALLOC}
LZERROR_GLOBALLOC = -5; { Не хватает оперативной памяти для структуры LZFile }
{$EXTERNALSYM LZERROR_GLOBLOCK}
LZERROR_GLOBLOCK = -6; { Неправельный глобальный заголовок }
{$EXTERNALSYM LZERROR_BADVALUE}
LZERROR_BADVALUE = -7; { Значение находится вне возможных значений }
{$EXTERNALSYM LZERROR_UNKNOWNALG}
LZERROR_UNKNOWNALG = -8; { Алгоритм сжатия не определен }
{ Prototypes }
{$EXTERNALSYM LZCopy}
function LZCopy(Source, Dest: Integer): Longint; stdcall;
{
Скопировать все данные из Source в Dest
функция LZCopy(ХэндлИз, ХэндлКуда):
- ХэндлИз : Из какого хранилища данных брать данные
- ХэндлКуда : В какое хранилище помещать те данные
- Резултат : Количество данных в ХэндлКуда (>=0) или код ошибки (<0)
- LZERROR_BADINHANDLE
- LZERROR_BADOUTHANDLE
- LZERROR_GLOBALLOC
- LZERROR_GLOBLOCK
- LZERROR_READ
}
{$EXTERNALSYM LZInit}
function LZInit(Source: Integer): Integer; stdcall;
{
Переделать хэндл в LZ77 хэндл.
Очень удобная функция если архив лежит скажем в ресурсе программы.
Пример :
MyLZFile := LZInit(MyStream.Handle); // TStream
MyLZFile := LZInit(GetStdHandle(STD_INPUT_HANDLE)) // STDIN в консольной программе
PS :
Закрыв заголовок LZ77 - LZClose, не забудте закрыть заголовок TStream.Free;
функция LZInit(Хэндл):
- Хэндл : Хэндл любого хранилища данных
- Резултат : Новый хэндл LZ77 файла (>=0) или код ошибки (<0)
- LZERROR_BADINHANDLE
- LZERROR_GLOBALLOC
- LZERROR_GLOBLOCK
- LZERROR_UNKNOWNALG
}
{$EXTERNALSYM GetExpandedName}
function GetExpandedName(Source, Buffer: PChar): Integer; stdcall;
{$EXTERNALSYM GetExpandedNameA}
function GetExpandedNameA(Source, Buffer: PAnsiChar): Integer; stdcall;
{$EXTERNALSYM GetExpandedNameW}
function GetExpandedNameW(Source, Buffer: PWideChar): Integer; stdcall;
{
Восстановить оригенальное имя файла
Если было правельно сжато...
Пример :
Файл MYPROGRAM.ZI_
вернёт MYPROG~1.ZIP
Так как функция существует со времён Windows 3.11
То и имя файл будет в виде 8.3 (8 знаков точка 3 знака)
функция GetExpandedName,GetExpandedNameA,GetExpandedNameW(ИмяФайла, Буффер):
- ИмяФайла : Имя файла архива PChar
- Буффер : Туда будет помещено обычное имя
- Резултат : Возвращает 1 если всё правильно или код ошибки.
- LZERROR_BADVALUE
}
{$EXTERNALSYM LZOpenFile}
function LZOpenFile(Filename: PChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
{$EXTERNALSYM LZOpenFileA}
function LZOpenFileA(Filename: PAnsiChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
{$EXTERNALSYM LZOpenFileW}
function LZOpenFileW(Filename: PWideChar; var ReOpenBuff: TOFStruct; Style: Word): Integer; stdcall;
{
Открыть файл LZ77
функция LZOpenFile,LZOpenFileA,LZOpenFileW(ИмяФайла, СтатусФайла, ОткрываемДля):
- ИмяФайла : Имя файла который нужно будет прочесть,создать,и.п.т.
- СтатусФайла : Переменная из Windows.pas
TOFStruct содержит
cBytes: Byte;
fFixedDisk: Byte;
nErrCode: Word;
Reserved1: Word;
Reserved2: Word;
szPathName: array[0..OFS_MAXPATHNAME-1] of CHAR;
- ОткрываемДля : Обчный режим открытия файла
- OF_CANCEL = Исползуется только в 16ти битных виндах
- OF_CREATE = Создаст новый файл. Если существует - то обнулит его.
- OF_DELETE = Удалит файл
- OF_EXIST = Откроет из закроет файл. Что-бы проверить его существование.
- OF_PARSE = Просто сольёт инфу в TOFStruct и закроет файл
- OF_PROMPT = Интересный параметр. Если файла нету открывает диалог [Retry] [Cancel]
Если пользователь нажмёт Cancel то LZOpenFile вернёт ошибку открытия файла...
- OF_READ = Открыть файл только для чтения.
- OF_READWRITE = Откроет файл для чтения и для записи.
- OF_REOPEN = Так и не понял для чего.
Из справки Borlad C++ 3.1
Opens the file using information in the reopen buffer.
- OF_SHARE_DENY_NONE = Не даст другим процессам доступа к чтению или записи этому файлу пока не освободится хэндл
- OF_SHARE_DENY_READ = Не даст другим файлам доступ на чтение к этому файлу пока не освободится хэндл
- OF_SHARE_DENY_WRITE = Не даст другим файлам доступ на запись к этому файлу пока не освободится хэндл
- OF_SHARE_EXCLUSIVE = Не даст другим процессам доступа к чтению и записи этому файлу пока не освободится хэндл
- OF_WRITE = Откроет файл для записи.
- Резултат : Возвращает хэндл файла (>=0) или код ошибки (<0)
- LZERROR_BADINHANDLE
- LZERROR_GLOBALLOC
}
{$EXTERNALSYM LZSeek}
function LZSeek(hFile: Integer; Offset: Longint; Origin: Integer): Longint; stdcall;
{
Сдвиг курсора в LZ77...
Функция LZSeek(Файл, Сдвиг, НачалоСдвига)
- Файл : Хэндл файла полученый из LZOpenFile
- Сдвиг : В какую точку файла делать сдвиг
- НачалоСдвига : От куда наченать сдвиг
- $0000 = С начала файла
- $0001 = С позиции курсора
- $0002 = С конца файла
- Резултат : Возвращает позицию курсора (>=0) или код ошибки (<0)
- LZERROR_BADINHANDLE
- LZERROR_BADVALUE
- LZERROR_GLOBLOCK
PS: Так как узнать размер будоющего фаила средствами делфи у меня не получилось
Пришлось выдумать альтернативу...
iExtractedSize := LZSeek(hFile, 0, 2); // Передвинуть курсор в самый конец файла и получить размер.
}
{$EXTERNALSYM LZRead}
function LZRead(hFile: Integer; Buffer: LPSTR; Count: Integer): Integer; stdcall;
{
Чтение данных файла LZ77...
Функция LZRead(Файл, Буффер,БайтЧитать)
- Файл : Хэндл файла полученый из LZOpenFile
- Буффер : PChar буффер куда будут скидываться данные
- Лучше всего подходит
- Var Buffer: Array[0..1023] Of Char;
- : Сколько байт нужно прочесть из файла
- Лучше всего подходит
- sizeof(Buffer)
- Резултат : Количество прочитанных байт из файла (>=0) или код ошибки (<0)
- LZERROR_BADINHANDLE
- LZERROR_BADOUTHANDLE
- LZERROR_BADVALUE
- LZERROR_GLOBALLOC
- LZERROR_GLOBLOCK
- LZERROR_READ
- LZERROR_WRITE
}
{$EXTERNALSYM LZClose}
procedure LZClose(hFile: Integer); stdcall;
{
Закрытие файла LZ77...
Процедура LZClose(Файл)
- Файл : Хэндл файла полученый из LZOpenFile
}
implementation
// Привязывание функций к dll в которой они лежат.
// Ведь не обезательно ей называться 'LZ32.DLL'
// Вы ведь можете переименовать длл-ку в MYEXCLUSIVE.UNPACKER
// И закинуть её в папку с проэктом...
const lz32 = 'LZ32.DLL';
function GetExpandedName; external lz32 name 'GetExpandedNameA';
function GetExpandedNameA; external lz32 name 'GetExpandedNameA';
function GetExpandedNameW; external lz32 name 'GetExpandedNameW';
procedure LZClose; external lz32 name 'LZClose';
function LZCopy; external lz32 name 'LZCopy';
function LZInit; external lz32 name 'LZInit';
function LZOpenFile; external lz32 name 'LZOpenFileA';
function LZOpenFileA; external lz32 name 'LZOpenFileA';
function LZOpenFileW; external lz32 name 'LZOpenFileW';
function LZRead; external lz32 name 'LZRead';
function LZSeek; external lz32 name 'LZSeek';
end.