Создаём собственный UnRar, используя unrar.dll

Previous  Top  Next

    
 

 

 

// Объявления

 

Code:

function RAROpenArchive(ArchiveData : Pointer): Integer; stdcall;

external 'unrar.dll' name 'RAROpenArchive';

 

function RARCloseArchive(hArcData : Integer): Integer; stdcall;

external 'unrar.dll' name 'RARCloseArchive';

 

function RARReadHeader(hArcData : Integer; HeaderData : Pointer): Integer; stdcall;

external 'unrar.dll' name 'RARReadHeader';

 

function RARProcessFile(hArcData : Integer; Operation : Integer; DestPath : Pointer;

DestName : Pointer): Integer; stdcall;

external 'unrar.dll' name 'RARProcessFile';

 

 

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;

 

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;

 

 

type

Char260 = Array [1..260] of Char;

 

TRAROpenArchiveData = record

  ArcName : PChar; // в C++ это будет выглядеть как: char *ArcName

  OpenMode : Cardinal;

  OpenResult : Cardinal;

  CmtBuf : PChar;

  CmtBufSize : Cardinal;

  CmtSize : Cardinal;

  CmtState : Cardinal;

end;

 

TRARHeaderData = record

  ArcName : Char260;

  FileName : Char260;

  Flags : Cardinal;

  PackSize : Cardinal;

  UnpSize : Cardinal;

  HostOS : Cardinal;

  FileCRC : Cardinal;

  FileTime : Cardinal;

  UnpVer : Cardinal;

  Method : Cardinal;

  FileAttr : Cardinal;

  CmtBuf : PChar;

  CmtBufSize : Cardinal;

  CmtSize : Cardinal;

  CmtState : Cardinal;

end;

 

 

var

RARExtract : boolean;

RAROpenArchiveData : TRAROpenArchiveData;

RARComment : array [1..256] of Char;

RARHeaderData : TRARHeaderData;

 

...

 

procedure ExtractRARArchive;

var

sDir : string;

s : string;

sTest : string;

iTest : integer;

bTestDone : boolean;

RARhnd : Integer;

RARrc : Integer;

PDestPath : Char260;

 

begin

RARExtract:=TRUE;

lKBWritten:=0;

ProgressBar2.Position := 0;

ProgressBar2.Max := lTotalSize;

RARStartTime:=Time;

 

RAROpenArchiveData.OpenResult:=99;

RAROpenArchiveData.OpenMode := RAR_OM_EXTRACT; // открываем для распаковки

RAROpenArchiveData.ArcName:= @RARFileName;

RAROpenArchiveData.CmtBuf := @RARComment;

RAROpenArchiveData.CmtBufSize := 255;

 

// Открываем RAR архив и выделяем память

RARhnd := RAROpenArchive (@RAROpenArchiveData);

If RAROpenArchiveData.OpenResult <> 0 then

begin

  case RAROpenArchiveData.OpenResult of

   ERAR_NO_MEMORY : s:='Not enough memory to initialize data structures';

   ERAR_BAD_DATA : s:='Archive header broken';

   ERAR_BAD_ARCHIVE : s:='File is not valid RAR archive';

   ERAR_EOPEN : s:='File open error';

  end;

  MessageDlg('Unable to open rar archive: ' + s + '!',mtError, [mbOK], 0);

end;

 

RARSetProcessDataProc(RARhnd,@Form.OnRarStatus);

StrPCopy(@PDestPath, EInstallPath.Text);

 

repeat

  RARrc := RARReadHeader (RARhnd, @RARHeaderData);// Читаем заголовок

  if RARrc <> ERAR_END_ARCHIVE then

  begin

   ProgressBar1.Position := 0;

   ProgressBar1.Max := RARHeaderData.UnpSize;

   s:=RARHeaderData.FileName;

   lblCurrentFile.Caption := s;

   lKBytesDone := 0;

  end;

 

  if RARrc = 0 then

  RARrc:=RARProcessFile (RARhnd, RAR_EXTRACT, @PDestPath, nil);

  if (RARrc <> 0) and (RARrc <> ERAR_END_ARCHIVE) then

  begin

   MessageDlg('An Error occured during extracting of ' + sTest+'!' + #13#10 +

   'RARProcessFile: ' + MakeItAString(RARrc),mtError, [mbOK], 0);

  end;

until RARrc <> 0;

 

// закрываем RAR архив и освобождаем память

If RARCloseArchive(RARhnd) <> 0 then

begin

  MessageDlg('Unable to close rar archive!',mtError, [mbOK], 0);

end;

end; // ExtractRARArchive

 

 

 

©Drkb::03190

Взято из http://forum.sources.ru