unrar.dll entpackt nicht -.- [Gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

unrar.dll entpackt nicht -.- [Gelöst]

Beitrag von Tsuki-Namida »

Hallo ich habe mir die aktuelle unrar.dll heruntergeladen und mit einem quelltext aus dem Forum getestet mit erfolg...

ich habe den quelltext etwas modifiziert und getestet mit erfolg...
hier erst mal der qulltext wie ich ihn nun habe um eine rar datei zu entpacken:

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

Procedure UnRar(Datei$)
  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
  
   Global hDLL.l
    Global *RAROpenArchive.l
    Global *RARCloseArchive.l
    Global *RARReadHeader.l
    Global *RARProcessFile.l
    Global *RARSetChangeVolProc.l
    Global *RARSetPassword.l

  OpenLibrary(0,"C:\unrar.dll")
    ;*RAROpenArchive=IsFunction(0,"RAROpenArchive")
    ;*RARCloseArchive=IsFunction(0,"RARCloseArchive")
    ;*RARReadHeader=IsFunction(0,"RARReadHeader")
    ;*RARProcessFile=IsFunction(0,"RARProcessFile")
    ;*RARGetDllVersion=IsFunction(0,"RARGetDllVersion")
    ;*RARSetChangeVolProc.l = IsFunction(0, "RARSetChangeVolProc")
    ;*RARSetPassword.l = IsFunction(0, "RARSetPassword")
   
    *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")
  
  OPR$=Datei$
        raropen\ArcName=OPR$
        raropen\CmtBuf = Space(16384)
        raropen\CmtBufSize = 16384
        raropen\OpenMode=#RAR_OM_EXTRACT
        hRAR=CallFunctionFast(*RAROpenArchive,@raropen)
       
        If raropen\OpenResult
          x = -1
          Else       
          Repeat
            stat=CallFunctionFast(*RARReadHeader,hRAR,@rarheader)
            If stat=0
              filelist.s=PeekS(@rarheader\FileName)
              res=CallFunctionFast(*RARProcessFile,hRAR,#RAR_EXTRACT,"","C:\Temp\"+filelist.s)
            EndIf
          Until stat<>0
          x = 1
        EndIf
  
        CallFunctionFast(*RARCloseArchive,hRAR)
   
    CloseLibrary(0)
    ProcedureReturn x
  EndProcedure
  
  Debug Unrar("C:\Dokumente und Einstellungen\Administrator\Desktop\Desktop.rar")
anschließend habe ich den text in mein projekt eingefügt und getestet nur da ohne erfolg.... die angegebee rar datei kann nicht entpackt werden...

wie man in meinem projekt gleich sehn kann überprüfe ich alles (glaube ich zu mindest) ich überproüfe die rar datei anhand ihrer größe ob sie im besagtem verzeichnis vorhanden ist und ich berprüfe nochmal im debuger ob das verzechnis richtig ist....
ich überprüfe auch ob die unrar.dll da ist oder nicht...

oaky hier der link zum quellentext (derlink deshalb weil es etwas über 1k zeilen sind)...

http://midicenter.rpgf.eu/projekt.pb
Zuletzt geändert von Tsuki-Namida am 30.04.2009 09:18, insgesamt 1-mal geändert.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ich nehme mal an, Dein Projekt nutzt UNICODE, das Beispiel aber nicht.

1. Strukturen haben in der Procedure nichts zu suchen
2. Nutze Prototypes

Code: Alles auswählen

EnableExplicit

#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
  ;PackSizeHigh.l
  UnpSize.q
  ;UnpSizeHigh.l
  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 RAROpenArchive.RAROpenArchive = GetFunction(DLL, "RAROpenArchiveEx")
    Global RARProcessFile.RARProcessFile = GetFunction(DLL, "RARProcessFileW")
    CompilerElse
    Global RAROpenArchive.RAROpenArchive = GetFunction(DLL, "RAROpenArchiveEx")
    Global RARProcessFile.RARProcessFile = GetFunction(DLL, "RARProcessFile")
    CompilerEndIf
    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, fFile.s
  Protected rarheader.RARHeaderDataEx
  Protected raropen.RAROpenArchiveDataEx
  
  DLL = Rar_Init()

  If DLL
    CompilerIf #PB_Compiler_Unicode
    raropen\ArcNameW = @rarfile
    CompilerElse
    raropen\ArcName= @rarfile
    CompilerEndIf
  
    raropen\OpenMode = #RAR_EXTRACT
  
    hRAR = RAROpenArchive(@raropen)
    If hRAR
      While Not RARReadHeader(hRAR, @rarheader)
        CompilerIf #PB_Compiler_Unicode
        fFile = PeekS(@rarheader\FileNameW)
        CompilerElse
        fFile  =PeekS(@rarheader\FileName)
        CompilerEndIf
        RARProcessFile(hRAR, #RAR_EXTRACT, destpath, destpath + fFile)
      Wend
      RARCloseArchive(hRAR)
      CloseLibrary(DLL)

      ProcedureReturn #True
    EndIf
  EndIf
  
  ProcedureReturn #False    
EndProcedure
Und immer die Ex-Strukturen nutzen, die anderen gibts nur zur Kompatibilität.

// edit
hab den Source mal abgeändert, so das man Archive komplett entpacken
kann, unicode oder ascii spielt keine Rolle.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

oaky im test projekt liev es wieder wie erwartet super....

nur jetzt im projekt bekomme ich die meldung:

Code: Alles auswählen

bei 'EnableExplicht' müssen Variabeln deklariert werden.
ich kan jetzt aber nicht alle variablen deklarieren..... ich müsste da ja denganzen projekt code durch gehn..... und das sind nicht wenige zeilen :freak:


und zu dem warum kommt plözlich die meldung? ich habe noch nie was von "Explicht" gehörtz bzw. gelesen.....

kann ma ndas ggf. auch umgehn?
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Einfach die erste Zeile löschen :mrgreen:

Aber Du solltest Dir angewöhnen damit zu arbeiten, dann haste auch weniger
Probleme mit Fehlern :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

okay ich hatte das übersehn -.-

naja gesagt, getan.....

jetzt bekomme ich aber in dieser zeile "hRAR = RAROpenArchive(@raropen)"
einen invalid memory access.....
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Magix-Soft <Kain> hat geschrieben:okay ich hatte das übersehn -.-

naja gesagt, getan.....

jetzt bekomme ich aber in dieser zeile "hRAR = RAROpenArchive(@raropen)"
einen invalid memory access.....
Aber nicht durch mein Beispiel :mrgreen:

Mach mal

Code: Alles auswählen

Rar_Init()
Debug RARGetDllVersion()
und sag mal ob Du Version 4 der DLL hast.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

oka der rückgabe wert ist "3" ich bin jaetzt auf der suche nach V.4....
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Magix-Soft <Kain> hat geschrieben:oka der rückgabe wert ist "3" ich bin jaetzt auf der suche nach V.4....
http://www.rarlab.com/rar/UnRARDLL.exe
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

okay noch mals vielen dank....

es kommt keine fehlermeldung mehr^^


die rar datei wird erfolgreich geöffnet aber das und im ziehl verzeichnis sind leider nicht alle dateien...

um genau zu sein es wird nur eine datei teilweise entpackt...

in dem archiev sind einige bilder im *.bmp, *.jpg und *.ico sowie eine text datei mit dem typ *.css
im ziehlverzeichnis wird nur die *.css datei extrahiert und diese ist dann 0 bayts groß .....

hier ist das rar archiv damit man sich ggf ein bild machen kann was für dateien gepackt sind.
http://midicenter.rpgf.eu/Blau.rar
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ändere mal:

Code: Alles auswählen

raropen\OpenMode = #RAR_EXTRACT
in

Code: Alles auswählen

raropen\OpenMode = #RAR_OM_EXTRACT
Hab da wohl nicht aufgepaßt :oops:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten