Utilisation de 7-zip32.dll pour la décompression

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Bonjour tout le monde,

Cherchant à désarchiver des fichiers ZIP (Comme vous l’avez surement déjà vu :)) je me suis pencher sur 7-Zip32.dll et voici le code que je viens de finir. Cela peu être à certain on ce sait jamais :)

Il faut forcement avoir 7-zip32.dll pour que cela fonctionne. le source est l'archive est sur http://www.koakdesign.info/news/?url=4d&val=32

Code : Tout sélectionner

EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

;{ - CONSTANTE
#FNAME_MAX32        = 513
;}
;{ - STRUCTURE
Structure tagINDIVIDUALINFO
  dwOriginalSize.l
  dwCompressedSize.l
  dwCRC.l
  uFlag.l
  uOSType.l
  wRatio.w
  wDate.w
  wTime.w
  szFileName.s{#FNAME_MAX32}
  dummy1.s{3}
  szAttribute.s{8}
  szMode.s{8}
EndStructure
;}
;{ - GLOBAL
Global openlibrary_7zip.l
;}

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.b setUnCompressZIP(filename.s, filedest.s, hWnd.l)
;
  Protected lresult.l
  Protected sresult.s

  If openlibrary_7zip <> 0
    If CallFunction(openlibrary_7zip, "SevenZipCheckArchive", @filename.s, 1) <> 0
      sresult = "x -y "+ Chr(34) + filename + Chr(34) + " " + Chr(34) + filedest + Chr(34) + " *"
      lresult = CallFunction(openlibrary_7zip, "SevenZip", hWnd, @sresult, @"", 0)
      If lresult = 0
        lresult = CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
        ProcedureReturn #True
      EndIf
      lresult = CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
    EndIf
  EndIf

EndProcedure

Procedure.b Uncompress_7zip(filename.s, filedest.s, hWnd.l)
;
  Protected i.l
  Protected lresult.l
  Protected udt7ZINDIVIDUALINFO.tagINDIVIDUALINFO

  ClearGadgetItems(2)
  
  openlibrary_7zip = OpenLibrary(#PB_Any,"7-zip32.dll")
  If openlibrary_7zip <> 0
    If CallFunction(openlibrary_7zip, "SevenZipCheckArchive", @filename, 1) <> 0
      If CallFunction(openlibrary_7zip, "SevenZipGetRunning") = 0
        lresult = CallFunction(openlibrary_7zip, "SevenZipSetBackGroundMode", 0)
        lresult = CallFunction(openlibrary_7zip, "SevenZipSetCursorMode", 0)
        lresult = CallFunction(openlibrary_7zip, "SevenZipOpenArchive", hWnd, @filename, 0)
        If lresult <> 0
          If CallFunction(openlibrary_7zip, "SevenZipFindFirst", lresult, @"*", udt7ZINDIVIDUALINFO) = 0
            Repeat
              i + 1
              AddGadgetItem(2, -1, udt7ZINDIVIDUALINFO\szFileName)
            Until CallFunction(openlibrary_7zip, "SevenZipFindNext", lresult, udt7ZINDIVIDUALINFO) <> 0
            CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
            setUnCompressZIP(filename, filedest, hWnd)
          EndIf
        EndIf
      Else
        Debug "Erreur: 7-Zip32.dll est déjà en cours d'execution"
      EndIf
    EndIf
    CloseLibrary(openlibrary_7zip)
    openlibrary_7zip = 0
  EndIf
  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+
; - ROUTINE DE TEST.

Define hWnd.l
Define event.l
hWnd = OpenWindow(0, 0, 0, 640, 500, "Zip Extractor", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
  ButtonGadget(0, 10, 10, 100, 20, "Chargement ZIP")
  ListViewGadget(2,10,40,400,250)
  Repeat
    event = WaitWindowEvent(50)
    If event  = #PB_Event_Gadget :
      If EventGadget() = 0
        Uncompress_7zip(OpenFileRequester("Ouvrir un archive zip", "", "Archive Zip|*.zip", 0), "temps\", hWnd)
      EndIf    
    EndIf
  Until event = #PB_Event_CloseWindow
EndIf
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

es que tu peux décompresser le fichier juste en mémoire, pour ne pas avoir à passer par le disque dur ?

(Je cherche à faire ça pour le format .rar :( )
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Bonjour,

J'avous que je ne sais pas, mais je vais faire des recherches a ce sujet.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Bonjour tout le monde,

J'ai vu que ce code ne fonctionne pas en activant le mode unicode et comme j'aurais besoin qu'il soit justement actif. Y aurait t'il quelqu'un pour m'aider a trouvais la solution?

sa merde deja a cette ligne (je penses que c'est du au "@filename" mais comment faire pour que sa soit en non unicode?):

Code : Tout sélectionner

If CallFunction(openlibrary_7zip, "SevenZipCheckArchive", @filename, 1) <> 0
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

si tu as besoin jsute de pas etre en unicode sur cette ligne, tu peux tenté d'écrire le chemin en mode non unicode

peut etre comme ca :

Code : Tout sélectionner

Procedure.i AllocateAsciiString(string$)
	Protected len = Len(string$), a
	*buffer = AllocateMemory(len)
	
	For a = 1 To len
		PokeA(*buffer, Asc(PeekS(@string$ + a * SizeOf(Character), 1)))
	Next
	
	ProcedureReturn *buffer
EndProcedure
Je dis peut etre une grosse connerie :mrgreen:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Bonjour graph100,

J'ai fait quelque essais avec ton code sa n'a pas l'air de vouloir. Mais bon je continu quand même et ne baisse pas les bras. Merci tout de même.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Re tous,

J'aissais de voir la fonction de "graph100", mais sa me pause problème si je fais comme suit je n'ai rien du tout, quelqu'un pourrait de dire pourquoi?

Code : Tout sélectionner

Procedure.i AllocateAsciiString(string$)
   Protected len = Len(string$), a
   *buffer = AllocateMemory(len)
   
   For a = 1 To len
      PokeA(*buffer, Asc(PeekS(@string$ + a * SizeOf(Character), 1)))
   Next
   
   ProcedureReturn *buffer
EndProcedure

Define *buffer = AllocateAsciiString("test pour voir")
Debug *buffer
Debug MemorySize(*buffer)
Debug PeekS(*buffer, MemorySize(*buffer))
c'est bon j'ai modifier la fonction pour que cela fonctionne voici le code :

Code : Tout sélectionner

Procedure.i AllocateAsciiString(string.s)
;
  Protected i.l
  Protected *buffer
  Protected len.l = Len(string)

  *buffer = AllocateMemory(len)
  For i = 0 To len
    PokeA(*buffer + i, Asc(PeekS(@string + i * SizeOf(Character), 1)))
  Next i
  ProcedureReturn *buffer

EndProcedure
cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

ça marche en partant de 0 ?
Je pige pas trop ^^.
Et la fonctionne marche dans ton programme ? Parce que normalement tu ne peux pas affiché un texte en ascii en mode unicode il me semble.
Vu que c'est la taille même des chaines de caractère qui change (2 octets au lieu de 1)
(je suis content que ça fonctionne ^^)

[edit] ah bah oui évidement : en prenant a = 1 au début je manquais le 1er caractère -_-
et aller jusqu'à a = len ça fait prendre le caractère de fin de chaine.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Re encore une fois tous,

graph100> Il y a aussi une modif a "PokeA(*buffer + i, ..."

J'ai pas mal avancer grace a "graph100", mais maintenant cela fonctionne pour desarchiver le zip même en mode Unicode. Le problème est que je n'arrive pas a avoir en claire la liste des fichiers. Quelqu'un aurait une idée?

Le code :

Code : Tout sélectionner

EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

;{ - CONSTANTE
#FNAME_MAX32            = 512
;}
;{ - STRUCTURE
Structure tagINDIVIDUALINFO
  dwOriginalSize.l
  dwCompressedSize.l
  dwCRC.l
  uFlag.l
  uOSType.l
  wRatio.w
  wDate.w
  wTime.w
  szFileName.s{#FNAME_MAX32 + 1}
  dummy1.s{3}
  szAttribute.s{8}
  szMode.s{8}
EndStructure
;}
;{ - GLOBAL
Global openlibrary_7zip.l
;}

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.s unicodetoAscii(string.s)
;
  Protected i.l
  Protected result.s
  Protected len.l = Len(string)

  For i = 0 To len
    result + Chr(Asc(PeekS(@string + i * SizeOf(Character), 1)))  
  Next i
  
  Debug result
  
  ProcedureReturn result

EndProcedure

Procedure.i AllocateAsciiString(string.s)
;
  Protected i.l
  Protected *buffer
  Protected len.l = Len(string)

  *buffer = AllocateMemory(len)
  For i = 0 To len
    PokeA(*buffer + i, Asc(PeekS(@string + i * SizeOf(Character), 1)))
  Next i
  ProcedureReturn *buffer

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.b setUnCompressZIP(filename.s, filedest.s, hWnd.l)
;
  Protected lresult.l
  Protected sresult.s
  Protected *buffer = AllocateAsciiString(filename)

  If openlibrary_7zip <> 0
    If CallFunction(openlibrary_7zip, "SevenZipCheckArchive", *buffer, 1) <> 0
      sresult = "x -y "+ Chr(34) + filename + Chr(34) + " " + Chr(34) + filedest + Chr(34) + " *"
      *buffer = AllocateAsciiString(sresult)
      lresult = CallFunction(openlibrary_7zip, "SevenZip", hWnd, *buffer, @"", 0)
      If lresult = 0
        lresult = CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
        ProcedureReturn #True
      EndIf
      lresult = CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
    EndIf
  EndIf

EndProcedure

Procedure.b Uncompress_7zip(filename.s, filedest.s, hWnd.l)
;
  Protected i.l
  Protected lresult.l
  Protected *buffer = AllocateAsciiString(filename)
  Protected udt7ZINDIVIDUALINFO.tagINDIVIDUALINFO

  ClearGadgetItems(2)  
  openlibrary_7zip = OpenLibrary(#PB_Any,"7-zip32.dll")
  If openlibrary_7zip <> 0
    
    ;CallFunction(openlibrary_7zip, "SevenZipSetUnicodeMode", -1)
    
    If CallFunction(openlibrary_7zip, "SevenZipGetRunning") = 0
      If CallFunction(openlibrary_7zip, "SevenZipCheckArchive", *buffer, 1) <> 0
        lresult = CallFunction(openlibrary_7zip, "SevenZipSetBackGroundMode", 0)
        lresult = CallFunction(openlibrary_7zip, "SevenZipSetCursorMode", 0)
        lresult = CallFunction(openlibrary_7zip, "SevenZipOpenArchive", hWnd, *buffer, 0)
        If lresult <> 0
          If CallFunction(openlibrary_7zip, "SevenZipFindFirst", lresult, @"*", udt7ZINDIVIDUALINFO) = 0
            Repeat
              i + 1
              AddGadgetItem(2, -1, unicodetoAscii(udt7ZINDIVIDUALINFO\szFileName))
            Until CallFunction(openlibrary_7zip, "SevenZipFindNext", lresult, udt7ZINDIVIDUALINFO) <> 0
            CallFunction(openlibrary_7zip, "SevenZipCloseArchive", lresult)
            setUnCompressZIP(filename, filedest, hWnd)
          EndIf
        EndIf
      EndIf
    Else
      Debug "Erreur: 7-Zip32.dll est déjà en cours d'execution"
    EndIf
    CloseLibrary(openlibrary_7zip)
    openlibrary_7zip = 0
  EndIf

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+
; - ROUTINE DE TEST.

Define hWnd.l
Define event.l
hWnd = OpenWindow(0, 0, 0, 640, 500, "Zip Extractor", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
  ButtonGadget(0, 10, 10, 100, 20, "Chargement ZIP")
  ListViewGadget(2,10,40,400,250)
  Repeat
    event = WaitWindowEvent(50)
    If event  = #PB_Event_Gadget :
      If EventGadget() = 0
        Uncompress_7zip(OpenFileRequester("Ouvrir un archive zip", "", "Archive Zip|*.zip", 0), "temps\", hWnd)
      EndIf    
    EndIf
  Until event = #PB_Event_CloseWindow
EndIf
encore une fois merci d'avance,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Utilisation de 7-zip32.dll pour la décompression

Message par venom »

Chez moi ton code renvoie ce qu'il y a dans l'archive. :? c'est quoi le souci exactement ?






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

il faut que je trouve la DLL pour tester !
@GallyHC : ah oui effectivement ça ne pouvais pas fonctionner en écrivant toujours au même endroit -_- désolé !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Bonjour tous,

graph100> l'erreur est humaine :) et perso je ne reste pas a une non compréhension d’un code. Même si je suis extrêmement limite en purebasic et je l’avous.

J’essais toujours de comprendre avant d’appliquer un code sinon il n’y a aucun itérer à le faire et je redonne ce que je trouve. C’est cela qui est bien dans l’échange (rien ne ce perd tout ce transforme, et c'est valable en code).

Alors vraiment merci pur ce code qui m’a déjà beaucoup aider.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

:wink: j'aime comment tu penses !

Sinon pour mon logiciel ScMangwa, (qui est un visionneur de manga), je cherche à ouvrir des archives (zip, rar) en mémoire (ne pas les décompresser sur le disque pour éviter d'écrire des fichiers). Et surtout, il faut que la méthode soit valable pour linux, window, et mac si possible. Des idées ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Utilisation de 7-zip32.dll pour la décompression

Message par GallyHC »

Je vais essayer de voir cela au plus vite. De memoire il y a une source sur vbfrance.com, je vais essayer de la retrouver et de l'adapter. Sinon je penses que 7zip32 peu lire les Rar mais je ne sais pas si c possible en memoire.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Utilisation de 7-zip32.dll pour la décompression

Message par graph100 »

je vais regarder ton code, avec la DLL. Je veux arriver à faire ce que je t'ai dis ^^
Je me demande si il faudrais pas partir de 7z.dll ou 7za.dll
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre