177 lines
4.6 KiB
ObjectPascal
177 lines
4.6 KiB
ObjectPascal
// 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.
|