Создаем собственный UnRar, используя unrar.dll
01.01.2007
// Объявления
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
Взято из https://forum.sources.ru