Seite 2 von 3

Verfasst: 03.11.2006 21:43
von Thomas
war doch nur ein scherz.

Übrigens, ich glaub ich hab mal sowas in der art im CodeArchiv gesehen.

Verfasst: 04.11.2006 11:21
von FGK
@Thomas Obermeier
Übrigens, ich glaub ich hab mal sowas in der art im CodeArchiv gesehen.
Glauben heißt nichts wissen - und in diesem Fall dann einfach "Finger weg von der Tastatur" :evil:


Gruß FGK

Verfasst: 04.11.2006 14:45
von onny
wow, super, vielen dank!

Verfasst: 31.12.2006 11:23
von onny

Code: Alles auswählen

;PB_unRAR - Paul Leischow, Sept.6, 2002
;RAR Archive extractor that uses the free UNRAR.DLL
;


#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
#RAR_DLL_VERSION=3


Structure RARHeaderData
  ArcName.b[260]
  FileName.b[260]
  Flags.l
  PackSize.l
  UnpSize.l
  HostOS.l
  FileCRC.l
  FileTime.l
  UnpVer.l
  Method.l
  FileAttr.l
  *CmtBuf.s
  CmtBufSize.l
  CmtSize.l
  CmtState.l
EndStructure
rarheader.RARHeaderData

Structure RAROpenArchiveData
  *ArcName.s
  OpenMode.l
  OpenResult.l
  *CmtBuf.s
  CmtBufSize.l
  CmtSize.l
  CmtState.l
EndStructure
raropen.RAROpenArchiveData



OpenLibrary(0,"unrar.dll") 
  *RAROpenArchive=IsFunction(0,"RAROpenArchive") 
  *RARCloseArchive=IsFunction(0,"RARCloseArchive") 
  *RARReadHeader=IsFunction(0,"RARReadHeader")  
  *RARProcessFile=IsFunction(0,"RARProcessFile") 
  *RARGetDllVersion=IsFunction(0,"RARGetDllVersion")


      raropen\ArcName="test.rar"
      raropen\OpenMode=#RAR_OM_EXTRACT
      hRAR=CallFunctionFast(*RAROpenArchive,@raropen)
      
      If raropen\OpenResult
        MessageRequester("Error","Could Not Open RAR File",#MB_ICONERROR)
        Else        
        Repeat 
          stat=CallFunctionFast(*RARReadHeader,hRAR,@rarheader)
          If stat=0
            filelist.s+PeekS(@rarheader\FileName[0])+Chr(10)
            res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,"c:",@rarheader\FileName[0])
          EndIf 
        Until stat<>0 
        MessageRequester("Files Extracted",filelist,#MB_ICONINFORMATION)
      EndIf

      CallFunctionFast(*RARCloseArchive,hRAR)
 
  CloseLibrary(0)

  
  
Damit funzt es echt super! Leider hab ich da noch ein Problem.
Beim Extrahieren weiss ich nicht wie ich den Pfad angeben soll... :roll:
DestPath
This parameter should point to a zero terminated string containing the
destination directory to which to extract files to. If DestPath is equal
to NULL it means extract to the current directory. This parameter has
meaning only if DestName is NULL.

DestName
This parameter should point to a string containing the full path and name
of the file to be extracted or NULL as default. If DestName is defined
(not NULL) it overrides the original file name saved in the archive and
DestPath setting.

Both DestPath and DestName must be in OEM encoding. If necessary,
use CharToOem to convert text to OEM before passing to this function.

Code: Alles auswählen

CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,"c:",@rarheader\FileName[0])
So funktionierst nicht... Wie muss ich den Pfad angeben... OEM sagt mir nichts. Hiermit vllt. Text$ = Chr(ASCII-Wert) :?

Verfasst: 31.12.2006 12:04
von Scarabol
Vielleicht nur ein Schreibfehler aber wenn du das Verzeichnis C meinst musst du C:\ schreiben oder?

Verfasst: 31.12.2006 12:32
von onny
Scarabol hat geschrieben:Vielleicht nur ein Schreibfehler aber wenn du das Verzeichnis C meinst musst du C:\ schreiben oder?
hat auch nicht geholfen, ich denke man darf nicht einfach den pfad in "" schreiben:

Code: Alles auswählen

Both DestPath and DestName must be in OEM encoding. If necessary,
use CharToOem to convert text to OEM before passing to this function.
hm... :|

Verfasst: 01.01.2007 19:54
von al90
Hab da mal was gemacht, da ich es eh für mein aktuelles project brauche.
Der Code basiert auf dem hier im Board. Allerdings habe ich noch einen
CallBack hinzugefügt. Dieser lässt jedoch zu wünschen übrig, da er meiner
meinung nach vielzu selten die CallBackProc anspringt und das Multitasking
bzw. prog durch die zu wenigen Events() stark blockiert wird. Aber ansonsten
klappt die routine soweit ganz gut und auch ein eigener Pfad kann angegeben
werden. :wink:

BTW:
Um den CallBack zu verfolgen, am besten im DebugModus starten und
unbedingt eine grosse (5MB+ oder so) Datei benutzen, da der CallBack
der dll wirklich sehr unregelmäßig ist und u.U. erst nach ein paar MB
den Callback wieder ausführt.

Code: Alles auswählen

Global len.l

Structure RAROpenArchiveData 
    ArcName.s 
    OpenMode.l 
    OpenResult.l 
    CmtBuf.s 
    CmtBufSize.l 
    CmtSize.l 
    CmtState.l 
EndStructure 

Structure RARHeaderData 
    ; ArcName As String * 260 
    ; FileName As String * 260 
    ArcName.b[260] 
    Filename.b[260] 
    flags.l 
    PckSize.l 
    UnpSize.l
    HostOS.l 
    FileCRC.l 
    FileTime.l 
    UnpVer.l 
    Method.l 
    FileAttr.l 
    CmtBuf.s 
    CmtBufSize.l 
    CmtSize.l 
    CmtState.l 
EndStructure 

Procedure.l CallBackRAR(msg.l,UserData.l,p1.l,p2.l)

;Debug msg
;Debug UserData
;Debug p1
len+p2
Debug "Current UnpackSize = " +Str(len)

EndProcedure

Procedure.l UnRarFile(RarArchive$,PackFile$,DestPath$)

x.l=0
lHandle.l 
iStatus.l 
uRAR.RAROpenArchiveData 
uHeader.RARHeaderData 
sStat.s 
Ret.l 
uRAR\ArcName = RarArchive$
uRAR\CmtBuf = Space(16384) 
uRAR\CmtBufSize = 16384 
uRAR\OpenMode = 1 ; 1 = Entpacken / 0 = Liste

If Right(DestPath$,1)<>"\" : DestPath$+"\" : EndIf

If OpenLibrary(0, "c:\unrar.dll") ; <---- Pfad nicht vergessen anzugeben!!!

  *RAROpenArchive.l = GetFunction(0, "RAROpenArchive") 
  *RARCloseArchive.l = GetFunction(0, "RARCloseArchive") 
  *RARReadHeader.l = GetFunction(0, "RARReadHeader") 
  *RARProcessFile.l = GetFunction(0, "RARProcessFile") 
  *RARSetChangeVolProc.l = GetFunction(0, "RARSetChangeVolProc") 
  *RARSetPassword.l = GetFunction(0, "RARSetPassword") 
  *RARSetCallback.l = GetFunction(0, "RARSetCallback")

  lHandle = CallFunctionFast(*RAROpenArchive,@uRAR) 
  CallFunctionFast(*RARSetCallback,lHandle,@CallBackRAR(),0)

  If uRAR\OpenResult = 0
    Repeat
      iStatus = CallFunctionFast(*RARReadHeader,lHandle, @uHeader) 
      If iStatus=0
        sStat = PeekS(@uHeader\Filename)
        If LCase(sStat) = LCase(PackFile$)
          Ret = CallFunctionFast(*RARProcessFile,lHandle, 2, "", DestPath$+GetFilePart(PackFile$))
          x=1
        Else
          Ret = CallFunctionFast(*RARProcessFile,lHandle, 0, "", "") 
        EndIf
      EndIf
    Until iStatus<>0
    CallFunctionFast(*RARCloseArchive, lHandle) 
  EndIf
  CloseLibrary(0)

EndIf

ProcedureReturn x

EndProcedure

UnRarFile("c:\zzz.rar","test4","c:\aaa\")

Verfasst: 02.01.2007 10:37
von Marvin
Müsste man den Pfad nicht einfach mit "@" angeben? :?

Code: Alles auswählen

res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,@"C:",@rarheader\FileName[0])

Verfasst: 02.01.2007 11:56
von onny
super, vielen dank, werde es ausprobieren!

Verfasst: 02.01.2007 13:25
von onny
funktioniert noch immer nicht :(

@al90:statt getfunction habe ich isfunction verwendet.... ich denke das machtn ichts... oder?

ich habe deinen code ausgeführt doch es hat sich nichts entpackt.

@Marvin: es wird was entpackt, aber meistens dort wo das programm ausgeführt wird. d.h. er erkennt keinen destpath$ parameter :(
vllt. stimmt was mit meiner unrar.dll nicht o.O