Стартовый пул
This commit is contained in:
176
unrar/Examples/Delphi/UnRAR.pas
Normal file
176
unrar/Examples/Delphi/UnRAR.pas
Normal 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.
|
266
unrar/Examples/Delphi/UnRDLL.dpr
Normal file
266
unrar/Examples/Delphi/UnRDLL.dpr
Normal 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.
|
Reference in New Issue
Block a user