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.
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
