Rebonjour tlm. C'est bon j'ai trouvé ce qu'il me fallait :) carrement un composant et une source :) c'est la source qu'il me fallait :big) , ben pour ceux qui veulent la voir, la voilà:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "UnRar.h"
#include "urar.h"
#ifdef UNRAR_smartinit
#pragma package(smart_init)
#endif
UNRAR_dcr // use resource ivory.dcr
int ProcessChangeVol(char* ArcName, int Name);
AnsiString TUnRar::ChangeDiskTitle = String("Insert new disk");
Forms::TModalResult TUnRar::ChangeDiskModalResult = mrNone;
//---------------------------------------------------------------------------
static inline TUnRar* ValidCtrCheck()
{
return new TUnRar(NULL);
}
//---------------------------------------------------------------------------
String __fastcall EUnRarError::GetErrString(TResult res)
{
if(res == resNoMemory) return "Not enough memory";
else if(res == resBadData) return "Bad data";
else if(res == resBadArchive) return "Bad archive";
else if(res == resOpenError) return "Open error";
else if(res == resEndOfFile) return "End of file";
else if(res == resCloseError) return "Close error";
else if(res == resCreateError) return "Create error";
else if(res == resReadError) return "Read error";
else if(res == resWriteError) return "Write error";
else if(res == resUnknownFormat) return "Unknown file format";
else if(res == resDllError) return "Couldn't open UNRAR.DLL";
else return "Unknown error";
}
//---------------------------------------------------------------------------
__fastcall TUnRar::TUnRar(Classes::TComponent* AOwner)
: TComponent(AOwner),
fEof(true), fResult(resNone), fArchiveCommentState(csNone),
fArchiveName(""), fArchiveComment(""), fHandle(NULL), fDestPath(""), fPassword(""),
fFileName(""), fExtract(false), fComment(""), fCommentState(csNone), fDictionarySize(0),
fActive(false), hDll(NULL), fExceptionOnError(true)
{
}
//---------------------------------------------------------------------------
__fastcall TUnRar::~TUnRar()
{
if(fIsOpen) Close();
if(hDll != NULL) FreeLibrary(hDll);
}
//---------------------------------------------------------------------------
bool __fastcall TUnRar::Open()//AnsiString filename, bool extract)
{
if(fActive)
{
fResult = resOpenError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
hDll = LoadLibrary("UNRAR");
if(hDll == NULL)
{
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
PROCUnRarOpen _RAROpenArchive = (PROCUnRarOpen)GetProcAddress(hDll, "RAROpenArchive");
if(_RAROpenArchive == NULL)
{
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
PROCUnRarSetPassword _RARSetPassword = (PROCUnRarSetPassword)GetProcAddress(hDll, "RARSetPassword");
if(_RARSetPassword == NULL)
{
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
PROCUnRarSetChangeVolProc _RARSetChangeVolProc = (PROCUnRarSetChangeVolProc)GetProcAddress(hDll, "RARSetChangeVolProc");
if(_RARSetChangeVolProc == NULL)
{
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
RAROpenArchiveData _OpenData;
char* _comment = new char[65536];
// fArchiveName = filename;
_OpenData.ArcName = fArchiveName.c_str();
_OpenData.OpenMode = fExtract ? RAR_OM_EXTRACT : RAR_OM_LIST;
_OpenData.CmtBuf = _comment;
_OpenData.CmtBufSize = 65536;
fResult = resOpenError;
fHandle = _RAROpenArchive(&_OpenData);
fArchiveComment = _comment;
delete _comment;
switch(_OpenData.OpenResult)
{
case 0: fResult = resOk; break;
case ERAR_NO_MEMORY: fResult = resNoMemory; break;
case ERAR_BAD_DATA: fResult = resBadData; break;
case ERAR_BAD_ARCHIVE: fResult = resBadArchive; break;
case ERAR_EOPEN: fResult = resOpenError; break;
}
switch(_OpenData.CmtState)
{
case 0: fArchiveCommentState = csNone; break;
case 1: fArchiveCommentState = csOk; break;
case ERAR_NO_MEMORY: fArchiveCommentState = csNoMemory; break;
case ERAR_BAD_DATA: fArchiveCommentState = csBadData; break;
case ERAR_UNKNOWN_FORMAT: fArchiveCommentState = csUnknownFormat; break;
}
if(fHandle!=NULL)
{
fEof = false;
fActive = true;
if(fPassword!="") _RARSetPassword(fHandle, fPassword.c_str());
_RARSetChangeVolProc(fHandle, ProcessChangeVol);
return ReadHeader();
}
else
{
fEof = true;
fActive = false;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
}
//---------------------------------------------------------------------------
bool __fastcall TUnRar::Close()
{
if(!fActive)
{
fResult = resCloseError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
fActive = false;
fEof = true;
PROCUnRarClose _RARCloseArchive = (PROCUnRarClose)GetProcAddress(hDll, "RARCloseArchive");
if(_RARCloseArchive == NULL)
{
FreeLibrary(hDll); hDll = NULL;
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
if(_RARCloseArchive(fHandle)==0)
{
FreeLibrary(hDll); hDll = NULL;
fResult = resOk;
return true;
}
else
{
FreeLibrary(hDll); hDll = NULL;
fResult = resCloseError;
if(fExceptionOnError) throw EUnRarError(fResult);
}
return false;
}
//---------------------------------------------------------------------------
bool __fastcall TUnRar::ReadHeader()
{
if(!fActive)
{
fResult = resOpenError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
/* if(fEof)
{
fResult = resEndOfFile;
// throw EUnRarError(fResult);
return false;
}*/
PROCUnRarHeader _RARReadHeader = (PROCUnRarHeader)GetProcAddress(hDll, "RARReadHeader");
if(_RARReadHeader == NULL)
{
FreeLibrary(hDll); hDll = NULL;
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
RARHeaderData _HeaderData;
char* _comment = new char[65536];
int retval;
_HeaderData.CmtBuf = _comment;
_HeaderData.CmtBufSize = 65536;
retval = _RARReadHeader(fHandle, &_HeaderData);
if(retval==0)
{
fResult = resOk;
fArchiveName = _HeaderData.ArcName;
fFileName = _HeaderData.FileName;
fFlags.Clear(); unsigned f _HeaderData.Flags, ds f & 0xE0;
if(f & 0x01) fFlags = fFlags << ffPrevVolume;
if(f & 0x02) fFlags = fFlags << ffNextVolume;
if(f & 0x04) fFlags = fFlags << ffPassword;
if(f & 0x08) fFlags = fFlags << ffComment;
if(f & 0x10) fFlags = fFlags << ffSolid;
if(ds==0xE0) { fFlags = fFlags << ffDirectory; fDictionarySize = 0; }
else if(ds==0) fDictionarySize = 64;
else if(ds==0x20) fDictionarySize = 128;
else if(ds==0x40) fDictionarySize = 256;
else if(ds==0x60) fDictionarySize = 512;
else if(ds==0x80) fDictionarySize = 1024;
else fDictionarySize = 0;
fPackedSize = _HeaderData.PackSize;
fUnpackedSize = _HeaderData.UnpSize;
switch(_HeaderData.HostOS)
{
case 0: fHostOS = hosMsDos; break;
case 1: fHostOS = hosOS2; break;
case 2: fHostOS = hosWin32; break;
case 3: fHostOS = hosUnix; break;
}
fCRC = _HeaderData.FileCRC;
fFileTime = _HeaderData.FileTime;
fRarVersion = _HeaderData.UnpVer;
fMethod = _HeaderData.Method;
fAttr = _HeaderData.FileAttr;
switch(_HeaderData.CmtState)
{
case 0: fCommentState = csNone; break;
case 1: fCommentState = csOk; break;
case ERAR_NO_MEMORY: fCommentState = csNoMemory; break;
case ERAR_BAD_DATA: fCommentState = csBadData; break;
case ERAR_UNKNOWN_FORMAT: fCommentState = csUnknownFormat; break;
}
fComment = _comment;
delete _comment;
return true;
}
else if(retval==ERAR_END_ARCHIVE)
{
delete _comment;
fResult = resEndOfFile;
fEof = true;
}
else
{
delete _comment;
fResult = resBadData;
throw EUnRarError(fResult);
}
return false;
}
//---------------------------------------------------------------------------
bool __fastcall TUnRar::Process(TRarOperation op, AnsiString DestName)
{
if(!fActive)
{
fResult = resOpenError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
if(fEof)
{
fResult = resEndOfFile;
return false;
}
PROCUnRarProcess _RARProcessFile = (PROCUnRarProcess)GetProcAddress(hDll, "RARProcessFile");
if(_RARProcessFile == NULL)
{
FreeLibrary(hDll); hDll = NULL;
fResult = resDllError;
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
int operation;
switch(op)
{
case opSkip: operation = RAR_SKIP; break;
case opTest: operation = RAR_TEST; break;
case opExtract: operation = RAR_EXTRACT; break;
}
char* destpath = (fDestPath=="") ? NULL : fDestPath.c_str();
char* destname = (DestName=="") ? NULL : DestName.c_str();
int retval = _RARProcessFile(fHandle, operation, destpath, destname);
switch(retval)
{
case 0: return ReadHeader();
case ERAR_BAD_DATA: fResult = resBadData; break;
case ERAR_BAD_ARCHIVE: fResult = resBadArchive; break;
case ERAR_UNKNOWN_FORMAT: fResult = resUnknownFormat; break;
case ERAR_EOPEN: fResult = resOpenError; break; // volume open error
case ERAR_ECREATE: fResult = resCreateError; break;
case ERAR_ECLOSE: fResult = resCloseError; break;
case ERAR_EREAD: fResult = resReadError; break;
case ERAR_EWRITE: fResult = resWriteError; break;
}
if(fExceptionOnError) throw EUnRarError(fResult);
return false;
}
//---------------------------------------------------------------------------
void __fastcall TUnRar::SetPassword(AnsiString s)
{
fPassword=s;
if(fActive)
{
PROCUnRarSetPassword _RARSetPassword = (PROCUnRarSetPassword)GetProcAddress(hDll, "RARSetPassword");
if(_RARSetPassword != NULL)
_RARSetPassword(fHandle, s.c_str());
}
}
//---------------------------------------------------------------------------
void __fastcall TUnRar::SetActive(bool active)
{
if(active) Open(); else Close();
}
//---------------------------------------------------------------------------
int ProcessChangeVol(char* ArcName, int Mode)
{
int retval = true;
if(Mode==RAR_VOL_ASK)
{
TOpenDialog* OpenDialog = new TOpenDialog(NULL);
OpenDialog->Title = TUnRar::ChangeDiskTitle;
OpenDialog->FileName = ArcName;
if(OpenDialog->Execute())
{
delete [] ArcName;
ArcName = new char[OpenDialog->FileName.Length()+1];
strcpy(ArcName, OpenDialog->FileName.c_str());
retval = true;
TUnRar::ChangeDiskModalResult = mrOk;
}
else
{
retval = false;
TUnRar::ChangeDiskModalResult = mrCancel;
}
delete OpenDialog;
}
return retval;
}
//---------------------------------------------------------------------------
namespace Unrar
{
void __fastcall UNRAR_package Register()
{
TComponentClass classes[1] = { __classid(TUnRar) };
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------