Page 1 sur 2

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

Publié : mar. 02/août/2011 13:42
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

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

Publié : mar. 02/août/2011 14:20
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 :( )

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

Publié : mar. 02/août/2011 14:39
par GallyHC
Bonjour,

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

Cordialement,
GallyHC

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

Publié : mer. 03/août/2011 11:48
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

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

Publié : mer. 03/août/2011 15:38
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:

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

Publié : jeu. 04/août/2011 8:00
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

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

Publié : jeu. 04/août/2011 10:08
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

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

Publié : jeu. 04/août/2011 10:47
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.

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

Publié : jeu. 04/août/2011 10:52
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

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

Publié : jeu. 04/août/2011 13:05
par venom
Chez moi ton code renvoie ce qu'il y a dans l'archive. :? c'est quoi le souci exactement ?






@++

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

Publié : jeu. 04/août/2011 13:55
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é !

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

Publié : jeu. 04/août/2011 14:35
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

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

Publié : jeu. 04/août/2011 16:24
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 ?

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

Publié : jeu. 04/août/2011 16:40
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

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

Publié : ven. 05/août/2011 23:43
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