Seite 3 von 3

Verfasst: 02.01.2007 20:46
von al90
onny hat geschrieben: @al90:statt getfunction habe ich isfunction verwendet.... ich denke das machtn ichts... oder?
Demnach benutzt Du PB3.94 ? Ich habe es mit der 4.02 probiert und es
klappt ohne probleme bei mir. Die DLL ist vom 14 December 2006.
Im zweifelsfall mal eine aktuelle von rarlab runterladen und nochmal
testen.

Verfasst: 02.01.2007 21:13
von al90
Marvin hat geschrieben:Müsste man den Pfad nicht einfach mit "@" angeben? :?

Code: Alles auswählen

res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,@"C:",@rarheader\FileName[0])
Gerade mal getestet. Klappt so nicht bei mir. nur ohne "@" und wenn
der "C:" Parameter leer "" ist. Hier nochmal eine überarbeitete
variante. Die DLL kann nun mit angegeben werden und #True wird
jetzt auch wirklich nur bei erfolg zurückgegeben.

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$,UnRarDLL$)

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, UnRarDLL$)

  *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$)) 
          If Ret=0 : x=1 : EndIf
        Else 
          Ret = CallFunctionFast(*RARProcessFile,lHandle, 0, "", "") 
        EndIf 
      EndIf 
    Until iStatus<>0 
    CallFunctionFast(*RARCloseArchive, lHandle) 
  EndIf 
  CloseLibrary(0) 

Else

  MessageRequester("Info", "UnRar.DLL konnte nicht geöffnet werden!", #MB_OK|#MB_ICONWARNING)

EndIf

ProcedureReturn x 

EndProcedure 

UnRarFile("c:\zzz.rar","aaa\asm.pb","c:\MyOwnFolder","C:\zzz\unrar.dll")

Verfasst: 03.01.2007 10:08
von knopwob
äähm, ich hab keine Ahnung ob das Relevant für das Problem ist. Aber du hast hinter dem C: noch ein Leerzeichen in den " ".

Hatte so ein ähnliches Problem mal, als n Programm von mir den Pfad zum Desktop nicht annehmen wollte. Da waren die Leerzeichen im Ordnernamen von "Dokumente und Einstellungen" die Ursache.

Verfasst: 03.01.2007 11:26
von onny
vielen dank, es funktioniert bei mir aber noch immer nicht. :cry: :cry:
Ich hab hier mal meine TEST-RAR hochgeladen, meine UNRAR.dll und mein PBUNRAR.pb Projekt. KA woran es liegen könnte. Habe schon mehrere RAR-Archive und UNRAR.dlls ausprobiert. Ich kann zwar destpatch$ als "" angeben und es funktioniert, aber eine Pfadangabe funktionierte noch nie :|

Verfasst: 06.01.2007 01:31
von al90
Hab's gerade auch nochmal auf meinen alten Athlon 1000 + Win98 getestet
und auch da geht's ohne probleme. Ich kann Dir daher leider auch nicht mehr
dazu sagen. :(

Verfasst: 06.01.2007 03:06
von Hellhound66

Code: Alles auswählen

Structure tTEST
    dummy.l
    TestString.b[10]
    dummy2.q
EndStructure

Test.tTEST
; CopyMemory(@"Hallo",@Test\TestString,Len("Hallo")+1)

Debug @Test\TestString
Debug @Test\TestString[0]
Das müsste bei dir den gleichen Wert ausgeben, wenn nicht, haben wir ein lustiges Problem. Kannst aber trotzdem mal beides probieren.
Kann es sein, dass im Array vorher irgendwelche anderen Daten geladen waren, sodass der neu reinkopierte String nicht 0-terminiert ist, weil er kürzer ist? Kopier auf jedenfall die 0 mit, sicher ist sicher.

Allerdings sollte eine direkte Übergabe

Code: Alles auswählen

CallFunctionFast(*RARProcessFile,lHandle, 2, "", DestPath$+GetFilePart(PackFile$)) 
auf jeden Fall funktionieren. Vielleicht nimmt du nen lokalen String und übergibst den, anstatt die Summe beider Strings.. Seltsam.

Verfasst: 24.03.2007 20:20
von onny
ahh, ich glaube ich habs hinbekommen, danke :D