Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компонент TDFUnRar кто-то использовал ? [D6, Win2k]


$Инъектор ©   (2006-01-17 11:48:00) 

Кто юзал компонент TDFunRar - кинте какойто пример.
В readme.txt список функций (конкретно никакого примера).

(Я скопировал unrar.dll в каталог с программой, добавил компоненты на форму).

Например в  результате сл. действий ничего не происходит.

procedure TForm1.Button1Click(Sender: TObject);
begin
dfunrar1.FileName:='d:\archiv.rar';
dfunrar1.Extract;
end;


Никаких функций -- куда распаковывать и получить коды ошибок (если такие были не происходит, то есть в исходниках опис. ошибки но как их "взять" ?). Как просто распаковать архив ?


$Инъектор   (2006-01-17 13:31:00) [1]

Этот модуль взятый из FAQ (работа c rar, исп. unrar.dll). Почему выдаются ошибки ?  Я его засунул в своё приложение. Ошибки выделены жирным цветом.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DFUnRar, StdCtrls, ComCtrls;

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
 TForm1 = class(TForm)
   Button1: TButton;
   ProgressBar1: TProgressBar;
   ProgressBar2: TProgressBar;
   procedure ExtractRARArchive;

 private
   { Private declarations }
 public
   { Public declarations }
 end;

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

 TRAROpenArchiveData = record
   ArcName : PChar; // a C++ yoi aoaao auaeyaaou eae: 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
 Form1: TForm1;
 RARExtract : boolean;
 RAROpenArchiveData : TRAROpenArchiveData;
 RARComment : array [1..256] of Char;
 RARHeaderData : TRARHeaderData;

implementation

{$R *.dfm}

procedure tform1.ExtractRARArchive;

var
 sDir : string;
 s : string;
 sTest : string;
 iTest : integer;
 bTestDone : boolean;
 RARhnd : Integer;
 RARrc : Integer;
 PDestPath : Char260;

begin
ProgressBar1.Position:=50;
 RARExtract:=TRUE;
  lKBWritten:=0;
 ProgressBar2.Position := 0;
ProgressBar2.Max := lTotalSize;
  RARStartTime:=Time;

 RAROpenArchiveData.OpenResult:=99;
 RAROpenArchiveData.OpenMode := RAR_OM_EXTRACT; // ioe?uaaai aey ?aniaeiaee
 RAROpenArchiveData.ArcName:= @RARFileName;
 RAROpenArchiveData.CmtBuf := @RARComment;
 RAROpenArchiveData.CmtBufSize := 255;

 // Ioe?uaaai RAR a?oea e auaaeyai iaiyou
 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);// ?eoaai caaieiaie
   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;

 // cae?uaaai RAR a?oea e inaiai?aaai iaiyou
 if RARCloseArchive(RARhnd) <> 0 then
 begin
   MessageDlg('Unable to close rar archive!',mtError, [mbOK], 0);
 end;
end;

end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо