Стартовый пул

This commit is contained in:
2024-04-02 08:46:59 +03:00
parent fd57fffd3a
commit 3bb34d000b
5591 changed files with 3291734 additions and 0 deletions

View File

@@ -0,0 +1,176 @@
// Delphi interface unit for UnRAR.dll
// Translated from unrar.h
// Use Delphi 2.0 and higher to compile this module
//
// Ported to Delphi by Eugene Kotlyarov, fidonet: 2:5058/26.9 ek@oris.ru
// Fixed version by Alexey Torgashin <alextp@mail.ru>, 2:5020/604.24@fidonet
//
// Revisions:
// Aug 2001 - changed call convention for TChangeVolProc and TProcessDataProc
// - added RARGetDllVersion function, see comment below
//
// Jan 2002 - Added RARSetCallback // eugene
//
// Oct 2002 - Added RARHeaderDataEx, RAROpenArchiveDataEx // eugene
unit UnRAR;
interface
uses Windows;
const
ERAR_END_ARCHIVE = 10;
ERAR_NO_MEMORY = 11;
ERAR_BAD_DATA = 12;
ERAR_BAD_ARCHIVE = 13;
ERAR_UNKNOWN_FORMAT = 14;
ERAR_EOPEN = 15;
ERAR_ECREATE = 16;
ERAR_ECLOSE = 17;
ERAR_EREAD = 18;
ERAR_EWRITE = 19;
ERAR_SMALL_BUF = 20;
ERAR_UNKNOWN = 21;
RAR_OM_LIST = 0;
RAR_OM_EXTRACT = 1;
RAR_SKIP = 0;
RAR_TEST = 1;
RAR_EXTRACT = 2;
RAR_VOL_ASK = 0;
RAR_VOL_NOTIFY = 1;
RAR_DLL_VERSION = 3;
UCM_CHANGEVOLUME = 0;
UCM_PROCESSDATA = 1;
UCM_NEEDPASSWORD = 2;
type
RARHeaderData = packed record
ArcName: packed array[0..Pred(260)] of AnsiChar;
FileName: packed array[0..Pred(260)] of AnsiChar;
Flags: UINT;
PackSize: UINT;
UnpSize: UINT;
HostOS: UINT;
FileCRC: UINT;
FileTime: UINT;
UnpVer: UINT;
Method: UINT;
FileAttr: UINT;
CmtBuf: PAnsiChar;
CmtBufSize: UINT;
CmtSize: UINT;
CmtState: UINT;
end;
RARHeaderDataEx = packed record
ArcName: packed array [0..1023] of AnsiChar;
ArcNameW: packed array [0..1023] of WideChar;
FileName: packed array [0..1023] of AnsiChar;
FileNameW: packed array [0..1023] of WideChar;
Flags: UINT;
PackSize: UINT;
PackSizeHigh: UINT;
UnpSize: UINT;
UnpSizeHigh: UINT;
HostOS: UINT;
FileCRC: UINT;
FileTime: UINT;
UnpVer: UINT;
Method: UINT;
FileAttr: UINT;
CmtBuf: PAnsiChar;
CmtBufSize: UINT;
CmtSize: UINT;
CmtState: UINT;
Reserved: packed array [0..1023] of UINT;
end;
RAROpenArchiveData = packed record
ArcName: PAnsiChar;
OpenMode: UINT;
OpenResult: UINT;
CmtBuf: PAnsiChar;
CmtBufSize: UINT;
CmtSize: UINT;
CmtState: UINT;
end;
RAROpenArchiveDataEx = packed record
ArcName: PAnsiChar;
ArcNameW: PWideChar;
OpenMode: UINT;
OpenResult: UINT;
CmtBuf: PAnsiChar;
CmtBufSize: UINT;
CmtSize: UINT;
CmtState: UINT;
Flags: UINT;
Reserved: packed array [0..31] of UINT;
end;
TUnrarCallback = function (Msg: UINT; UserData, P1, P2: Integer) :Integer; stdcall;
const
_unrar = 'unrar.dll';
function RAROpenArchive(var ArchiveData: RAROpenArchiveData): THandle;
stdcall; external _unrar;
function RAROpenArchiveEx(var ArchiveData: RAROpenArchiveDataEx): THandle;
stdcall; external _unrar;
function RARCloseArchive(hArcData: THandle): Integer;
stdcall; external _unrar;
function RARReadHeader(hArcData: THandle; var HeaderData: RARHeaderData): Integer;
stdcall; external _unrar;
function RARReadHeaderEx(hArcData: THandle; var HeaderData: RARHeaderDataEx): Integer;
stdcall; external _unrar;
function RARProcessFile(hArcData: THandle; Operation: Integer; DestPath, DestName: PChar): Integer;
stdcall; external _unrar;
procedure RARSetCallback(hArcData: THandle; UnrarCallback: TUnrarCallback; UserData: Integer);
stdcall; external _unrar;
procedure RARSetPassword(hArcData: THandle; Password: PChar);
stdcall; external _unrar;
// Wrapper for DLL's function - old unrar.dll doesn't export RARGetDllVersion
// Returns: -1 = DLL not found; 0 = old ver. (C-style callbacks); >0 = new ver.
function RARGetDllVersion: integer;
// obsolete functions
type
TChangeVolProc = function(ArcName: PAnsiChar; Mode: Integer): Integer; stdcall;
TProcessDataProc = function(Addr: PUChar; Size: Integer): Integer; stdcall;
procedure RARSetChangeVolProc(hArcData: THandle; ChangeVolProc: TChangeVolProc);
stdcall; external _unrar;
procedure RARSetProcessDataProc(hArcData: THandle; ProcessDataProc: TProcessDataProc);
stdcall; external _unrar;
implementation
type
TRARGetDllVersion = function: integer; stdcall;
function RARGetDllVersion: integer;
var
h: THandle;
f: TRARGetDllVersion;
begin
h := LoadLibrary(_unrar);
if h = 0 then begin
Result := -1;
Exit
end;
f := GetProcAddress(h, 'RARGetDllVersion');
if @f = nil then
Result := 0
else
Result := f;
FreeLibrary(h);
end;
end.

View File

@@ -0,0 +1,266 @@
// UnRDLL - simple example of UnRAR.dll usage
// Translated from UnRDLL.c
// Use Delphi 2.0 or higher to compile this module
//
// Ported to Delphi by Eugene Kotlyarov, fidonet: 2:5058/26.9 ek@oris.ru
// Fixed version by Alexey Torgashin <alextp@mail.ru>, 2:5020/604.24@fidonet
program UnRDLL;
{$APPTYPE CONSOLE}
{$H+}
uses AnsiStrings, Windows, UnRAR, SysUtils;
const
EXTRACT = 0;
TEST = 1;
PRINT = 2;
procedure ShowComment(CmtBuf: PAnsiChar); forward;
procedure OutHelp; forward;
procedure OutOpenArchiveError(Error: Integer; ArcName: PAnsiChar); forward;
procedure OutProcessFileError(Error: Integer); forward;
procedure ShowArcInfo(Flags: UINT; ArcName: PAnsiChar); forward;
const
CR = #13#10;
function SFmt(const S: AnsiString; Width: Byte): AnsiString;
begin
if Length(S) < Width then
Result := S + StringOfChar(AnsiChar(' '), Width - Length(S))
else
Result := Copy(S, 1, Width);
end;
function CallbackProc(msg: UINT; UserData, P1, P2: integer) :integer; stdcall;
var
Ch: AnsiChar;
I: Integer;
C: PAnsiChar;
S: AnsiString;
begin
Result := 0;
case msg of
UCM_CHANGEVOLUME:
if (P2 = RAR_VOL_ASK) then begin
Write(CR, 'Insert disk with ', PAnsiChar(P1), ' and press ''Enter'' or enter ''Q'' to exit ');
Readln(Ch);
if (UpCase (Ch) = 'Q') then
Result := -1;
end;
UCM_NEEDPASSWORD:
begin
Write(CR, 'Please enter the password for this archive: ');
Readln(S);
C := PAnsiChar(S);
Move(pointer(C)^, pointer(p1)^, AnsiStrings.StrLen(C) + 1);
//+1 to copy the zero
end;
UCM_PROCESSDATA: begin
if (UserData <> 0) and (PINT (UserData)^ = PRINT) then begin
Flush (Output);
// Windows.WriteFile fails on big data
for I := 0 to P2 - 1 do
Write(PAnsiChar(P1 + I)^);
Flush (Output);
end;
end;
end;
end;
procedure ExtractArchive(ArcName: PAnsiChar; Mode: Integer);
var
hArcData: THandle;
RHCode, PFCode: Integer;
CmtBuf: array[0..Pred(16384)] of AnsiChar;
HeaderData: RARHeaderData;
OpenArchiveData: RAROpenArchiveDataEx;
Operation: Integer;
begin
OpenArchiveData.ArcName := ArcName;
OpenArchiveData.CmtBuf := @CmtBuf;
OpenArchiveData.CmtBufSize := SizeOf(CmtBuf);
OpenArchiveData.OpenMode := RAR_OM_EXTRACT;
hArcData := RAROpenArchiveEx(OpenArchiveData);
if (OpenArchiveData.OpenResult <> 0) then
begin
OutOpenArchiveError(OpenArchiveData.OpenResult, ArcName);
Exit;
end;
ShowArcInfo(OpenArchiveData.Flags, ArcName);
if (OpenArchiveData.CmtState = 1) then
ShowComment(CmtBuf);
RARSetCallback (hArcData, CallbackProc, Integer (@Mode));
HeaderData.CmtBuf := nil;
repeat
RHCode := RARReadHeader(hArcData, HeaderData);
if RHCode <> 0 then
Break;
case Mode of
EXTRACT: Write(CR, 'Extracting ', SFmt(HeaderData.FileName, 45));
TEST: Write(CR, 'Testing ', SFmt(HeaderData.FileName, 45));
PRINT: Write(CR, 'Printing ', SFmt(HeaderData.FileName, 45), CR);
end;
if Mode = EXTRACT then
Operation := RAR_EXTRACT
else
Operation := RAR_TEST;
PFCode := RARProcessFile(hArcData, Operation, nil, nil);
if (PFCode = 0) then
Write(' Ok')
else begin
OutProcessFileError(PFCode);
Break;
end;
until False;
if (RHCode = ERAR_BAD_DATA) then
Write(CR, 'File header broken');
RARCloseArchive(hArcData);
end;
procedure ListArchive(ArcName: PAnsiChar);
var
hArcData: THandle;
RHCode, PFCode: Integer;
CmtBuf: array[0..Pred(16384)] of AnsiChar;
HeaderData: RARHeaderDataEx;
OpenArchiveData: RAROpenArchiveDataEx;
begin
OpenArchiveData.ArcName := ArcName;
OpenArchiveData.CmtBuf := @CmtBuf;
OpenArchiveData.CmtBufSize := SizeOf(CmtBuf);
OpenArchiveData.OpenMode := RAR_OM_LIST;
hArcData := RAROpenArchiveEx(OpenArchiveData);
if (OpenArchiveData.OpenResult <> 0) then
begin
OutOpenArchiveError(OpenArchiveData.OpenResult, ArcName);
Exit;
end;
ShowArcInfo(OpenArchiveData.Flags, ArcName);
if (OpenArchiveData.CmtState = 1) then
ShowComment(CmtBuf);
RARSetCallback (hArcData, CallbackProc, 0);
HeaderData.CmtBuf := @CmtBuf;
HeaderData.CmtBufSize := SizeOf(CmtBuf);
Write(CR, 'File', StringOfChar(' ',42),'Size');
Write(CR, StringOfChar('-', 50));
repeat
RHCode := RARReadHeaderEx(hArcData, HeaderData);
if RHCode <> 0 then
Break;
Write(CR, SFmt(HeaderData.FileName, 39), ' ',
(HeaderData.UnpSize + HeaderData.UnpSizeHigh * 4294967296.0):10:0);
if (HeaderData.CmtState = 1) then
ShowComment(CmtBuf);
PFCode:= RARProcessFile(hArcData, RAR_SKIP, nil, nil);
if (PFCode <> 0) then
begin
OutProcessFileError(PFCode);
Break;
end;
until False;
if (RHCode = ERAR_BAD_DATA) then
Write(CR, 'File header broken');
RARCloseArchive(hArcData);
end;
procedure ShowComment(CmtBuf: PAnsiChar);
begin
Write(CR, 'Comment:', CR, CmtBuf, CR);
end;
procedure ShowArcInfo(Flags: UINT; ArcName: PAnsiChar);
function CheckFlag(S: AnsiString; FlagBit: UINT): AnsiString;
begin
if (Flags and FlagBit) > 0 then result := 'yes' else result := 'no';
Write(CR, Format('%-16s %s',[S, Result]));
end;
begin
Writeln(CR, 'Archive ', ArcName);
CheckFlag('Volume:', 1);
CheckFlag('Comment:', 2);
CheckFlag('Locked:', 4);
CheckFlag('Solid:', 8);
CheckFlag('New naming:', 16);
CheckFlag('Authenticity:', 32);
CheckFlag('Recovery:', 64);
CheckFlag('Encr.headers:', 128);
CheckFlag('First volume:', 256);
Writeln(CR, '---------------------------');
end;
procedure OutHelp;
begin
Write(CR, 'UNRDLL. This is a simple example of UNRAR.DLL usage', CR);
Write(CR, 'Syntax:', CR);
Write(CR, 'UNRDLL X <Archive> extract archive contents');
Write(CR, 'UNRDLL T <Archive> test archive contents');
Write(CR, 'UNRDLL P <Archive> print archive contents to stdout');
Write(CR, 'UNRDLL L <Archive> view archive contents', CR);
end;
procedure OutOpenArchiveError(Error: Integer; ArcName: PAnsiChar);
begin
case Error of
ERAR_NO_MEMORY: Write(CR, 'Not enough memory');
ERAR_EOPEN: Write(CR, 'Cannot open ', ArcName);
ERAR_BAD_ARCHIVE: Write(CR, ArcName, ' is not RAR archive');
ERAR_BAD_DATA: Write(CR, ArcName, ': archive header broken');
ERAR_UNKNOWN: Write(CR, 'Unknown error');
end;
end;
procedure OutProcessFileError(Error: Integer);
begin
case Error of
ERAR_UNKNOWN_FORMAT: Write('Unknown archive format');
ERAR_BAD_ARCHIVE: Write('Bad volume');
ERAR_ECREATE: Write('File create error');
ERAR_EOPEN: Write('Volume open error');
ERAR_ECLOSE: Write('File close error');
ERAR_EREAD: Write('Read error');
ERAR_EWRITE: Write('Write error');
ERAR_BAD_DATA: Write('CRC error');
ERAR_UNKNOWN: Write('Unknown error');
end;
end;
begin
if ParamCount <> 2 then
begin
OutHelp;
Halt(0);
end;
case UpCase(ParamStr(1)[1]) of
'X': ExtractArchive(PAnsiChar(AnsiString(ParamStr(2))), EXTRACT);
'T': ExtractArchive(PAnsiChar(AnsiString(ParamStr(2))), TEST);
'P': ExtractArchive(PAnsiChar(AnsiString(ParamStr(2))), PRINT);
'L': ListArchive(PAnsiChar(AnsiString(ParamStr(2))));
else
OutHelp;
end;
Halt(0);
end.