Code: Alles auswählen
EnableExplicit
Enumeration ; UNRARCALLBACK_MESSAGES
#UCM_CHANGEVOLUME
#UCM_PROCESSDATA
#UCM_NEEDPASSWORD
EndEnumeration
#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
#ERAR_MISSING_PASSWORD = 22
#RAR_HEADERFLAG_ENCRYPTED = %00000100
#RAR_OM_LIST = 0
#RAR_OM_EXTRACT = 1
#RAR_OM_LIST_INCSPLIT = 2
#RAR_SKIP = 0
#RAR_TEST = 1
#RAR_EXTRACT = 2
#RAR_VOL_ASK = 0
#RAR_VOL_NOTIFY = 1
#RAR_DLL_VERSION = 4
Structure RARHeaderDataEx
ArcName.b[1024]
ArcNameW.w[1024]
FileName.b[1024]
FileNameW.w[1024]
Flags.l
PackSize.q
UnpSize.q
HostOS.l
FileCRC.l
FileTime.l
UnpVer.l
Method.l
FileAttr.l
*CmtBuf.l
CmtBufSize.l
CmtSize.l
CmtState.l
Reserved.l[1024]
EndStructure
Structure RAROpenArchiveDataEx
*ArcName
*ArcNameW
OpenMode.l
OpenResult.l
*CmtBuf.l
CmtBufSize.l
CmtSize.l
CmtState.l
Flags.l
Reserved.l[32]
EndStructure
Prototype UNRARCALLBACK(msg, UserData, P1, P2)
Prototype CHANGEVOLPROC(ArcName.s, Mode)
Prototype PROCESSDATAPROC(*Addr, Size)
Prototype RAROpenArchive(*ArchiveData.RAROpenArchiveDataEx)
Prototype RARCloseArchive(hArcData)
Prototype RARReadHeader(hArcData, *HeaderData.RARHeaderDataEx)
Prototype RARProcessFile(hArcData, Operation, DestPath.s, DestName.s)
Prototype RARSetCallback(hArcData, *Callback.UNRARCALLBACK, UserData)
Prototype RARSetChangeVolProc(hArcData, *ChangeVolProc.CHANGEVOLPROC)
Prototype RARSetProcessDataProc(hArcData, *ProcessDataProc.PROCESSDATAPROC)
Prototype RARSetPassword(hArcData, Password.p-ascii)
Prototype RARGetDllVersion()
Procedure Rar_Init()
Protected DLL = OpenLibrary(#PB_Any, "unrar.dll")
If DLL
CompilerIf #PB_Compiler_Unicode
Global RARProcessFile.RARProcessFile = GetFunction(DLL, "RARProcessFileW")
CompilerElse
Global RARProcessFile.RARProcessFile = GetFunction(DLL, "RARProcessFile")
CompilerEndIf
Global RAROpenArchive.RAROpenArchive = GetFunction(DLL, "RAROpenArchiveEx")
Global RARReadHeader.RARReadHeader = GetFunction(DLL, "RARReadHeaderEx")
Global RARCloseArchive.RARCloseArchive = GetFunction(DLL, "RARCloseArchive")
Global RARSetCallback.RARSetCallback = GetFunction(DLL, "RARSetCallback")
Global RARSetChangeVolProc.RARSetChangeVolProc = GetFunction(DLL, "RARSetChangeVolProc")
Global RARSetProcessDataProc.RARSetProcessDataProc = GetFunction(DLL, "RARSetProcessDataProc")
Global RARSetPassword.RARSetPassword = GetFunction(DLL, "RARSetPassword")
Global RARGetDllVersion.RARGetDllVersion = GetFunction(DLL, "RARGetDllVersion")
ProcedureReturn DLL
EndIf
ProcedureReturn #False
EndProcedure
Procedure RAR_Unpack(rarfile.s, destpath.s = "")
Protected hRAR, DLL
Protected rarheader.RARHeaderDataEx
Protected raropen.RAROpenArchiveDataEx
DLL = Rar_Init()
If DLL
CompilerIf #PB_Compiler_Unicode
raropen\ArcNameW = @rarfile
CompilerElse
raropen\ArcName= @rarfile
If destpath
CharToOem_(destpath, destpath)
EndIf
CompilerEndIf
raropen\OpenMode = #RAR_OM_EXTRACT
hRAR = RAROpenArchive(@raropen)
If hRAR
While Not RARReadHeader(hRAR, @rarheader)
RARProcessFile(hRAR, #RAR_EXTRACT, destpath, #NULL$)
Wend
RARCloseArchive(hRAR)
CloseLibrary(DLL)
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure