[UDF] 7-Zip avec Dll x32 et x64

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Cautex
Niveau 2
Niveau 2
Messages : 21
Enregistré le : mar. 05 juin 2012 18:24
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#41

Message par Cautex »

Bonjour,

Petit déterrage de topic mais udf que je commence à utiliser intensivement et voici un problème que je rencontre:
la fonction _7ZipAdd ne fonctionne pas lorsqu'on lui demande d'ajouter à l'archive un fichier contenant le caractère "°" (symbole degré).
la fonction ne retourne pas d'erreur et n'ajoute pas le fichier à l'archive (le problème semble venir de la dll).

pour le moment je contourne le problème simplement en supprimant ce caractère du nom des fichiers mais si cela pouvait être corrigé ça serait top :)

Sinon avant j’utilisais l'udf _Zip.au3 de wraithdu mais je le trouve moins stable que 7Zip.au3 .

Dans tous les cas merci pour ce travail :wink:
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#42

Message par walkson »

Bonjour,
C'est vrai que ça date "2008". Je n'ai pas testé l'UDf mais je sais que l'on peut en command line créer une archive.
Il suffit de télécharger à cette adresse http://www.7-zip.org/a/7z1514-extra.7z (7-Zip Extra: standalone console version) et de récupérer 7za.exe.
Ce programme fonctionne seul sans DLL ou installation. Après, il suffit de faire par exemple ShellExecute("7za.exe","a ARC.7z C:\Users\Pc\Desktop\Alpha°")
Le signe degré ne pose pas de problème
Voilà le détail des CL
► Afficher le texte
ps: il y a eu une MAJ en décembre 2015
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Cautex
Niveau 2
Niveau 2
Messages : 21
Enregistré le : mar. 05 juin 2012 18:24
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#43

Message par Cautex »

Bonjour walkson,

merci, je vais suivre ton conseil.
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#44

Message par Sydneysyd »

Je viens de lire tous les postes, ainsi que l'udf d'exemple pour une chose que je veux faire mais je n'y arrive pas...

Au passage, merci Tlem pour ce partage, car c'est un UDF génial ! ! ! ^^

Code : Tout sélectionner

;Example 2
$ArcFile = FileOpenDialog("Select archive", "", "Archive Files (*.7z;*.zip;*.gzip;*.bzip2;*.tar)")
If @error Then Exit

$Output = FileSelectFolder("Select output folder", "")
If @error Then Exit

$sExclude = "*.bmp"

$retResult = _7ZIPExtractEx(0, $ArcFile, $Output, 0, 1, 1, 0, 0, 0, $sExclude)
If @error = 0 Then
	MsgBox(64, "_7ZIPExtractEx", $retResult)
Else
	MsgBox(16, "_7ZIPExtractEx", "Error occurred")
EndIf

Donc, je me doute que c'est là dedans que j'ai réponse mais je ne vois vraiment pas.

Code : Tout sélectionner

_7ZIPExtract(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\")
Tout se dézippe correctement, mais mon archive à plusieurs dossiers, et tout se dézippe dans le même dossier !

J'ai vu qu'un membre avait le même souci et Tlem a dit d'aller voir dans le code plus haut.

Donc, je pense que dans les options, il faut que je mette 0 ou 1 après les virgules, mais comment je sais à quoi cela correspond ?

Ex :

Code : Tout sélectionner

_7ZIPExtract(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",0,1)
Je suis sûr que c'est simple, mais là je capte pas...

Merci d'avance

Cdt
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#45

Message par Tlem »

; #FUNCTION# ====================================================================================================================
; Name...........: _7ZIPExtract
; Description ...: Extracts files from archive to the current directory or to the output directory
; Syntax.........: _7ZIPExtract($hWnd, $sArcName[, $sOutput = 0[, $sHide = 0[, $sOverwrite = 0[, $sRecurse = 1[, _
; $sIncludeArc[, $sExcludeArc[, $sIncludeFile = 0[, $sExcludeFile = 0[, $sPassword = 0[, _
; $sYes = 0]]]]]]]]]])
; Parameters ....: $hWnd - Handle to parent or owner window
; $sArcName - Archive file name
; $sOutput - Output directory
; $sHide - Use this switch if you want the CallBack function to be called
; $sOverwrite - Overwrite mode: 0 - Overwrite All existing files without prompt, _
; 1 - Skip extracting of existing files, _
; 2 - Auto rename extracting file, _
; 3 - auto rename existing file
; $sRecurse - Recursion method: 0 - Disable recursion
; 1 - Enable recursion
; 2 - Enable recursion only for wildcard names
; $sIncludeArc - Include archive filenames
; $sExcludeArc - Exclude archive filenames
; $sIncludeFile - Include filenames, specifies filenames and wildcards or list file that specify processed files
; $sExcludeFile - Exclude filenames, specifies what filenames or (and) wildcards must be excluded from operation
; $sPassword - Specifies password
; $Yes - assume Yes on all queries
;
; Return values .: Success - Returns the string with results
; Failure - Returns 0 and and sets @error
; @Error - 0 = No error.
; |1 = Function failed
; |2 = Dll not started
;
; Author ........: R. Gilman (rasim)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Bonsoir, a vu de nez, je dirait qu'il faut utiliser l'option $sRecurse.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#46

Message par Sydneysyd »

Merci beaucoup Tlem mais, apparemment cela ne fonctionne pas...

Code : Tout sélectionner

_7ZIPExtract(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",1,0,1)
Je mets bien 1 sur avant la fin de la parenthèse (ce qui correspond à la recursive) et pourtant il m'extrait tout dans le meme dossier, à la différence que j'ai plein de dossier vide en plus !

Je rate un truc mais quoi ?

J'ai lu les autres options, mais je ne vois rien qui m'indique d'extraire les dossiers tel qu'ils sont compressés.

Je suis sur que je vais passer pour un âne quand je vais voir la solution, mais c'est toujours quand c'est sous son nez que l'on ne voit rien...
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#47

Message par Sydneysyd »

Après avoir pris un peu de recul, je viens de comprendre (enfin j'espère...) que c'est le premier nombre qui détermine les dossiers d'extraction comme dans le zip :)

Code : Tout sélectionner

_7ZIPExtract(1, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",1,0,1)
Le souci est que quand je lance mon code, et que je clique sur le bouton installer, le logiciel ne répond plus...
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#48

Message par Tlem »

Bonjour sydnaysyd,
Je n'ai pour l'instant pas de temps pour regarder ça de près.
Par contre je peux vous dire que le "premier nombre" ne sert pas à ce que vous croyez. Il s'agit du handle retourné par la fonction 7zipStartup ou un nom de ce genre (je suis sur le smartphone, donc pas accès à la liste des fonctions).
Vous devriez jeter un coup d'œil sur les exemples de L'UDF. Il me semble qu'il y a un exemple avec la récursion.

Bonne recherche.

Edit : Au cas où... Prenez bien L'UDF sur le lien que je donne vers le forum US et non L'UDF joint au premier message (qui ne sert que d'archive).


Envoyé de mon SM-N9005 en utilisant Tapatalk


Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#49

Message par Sydneysyd »

Merci Tlem de ce retour, j'ai cherché sur le forum autoit mais je n'ai rien trouvé et les liens de l'udf original sont HS...

Je pense avoir compris les options et dans quel sens les mettre

[0, dossier d'origine de l'archive, dossier de sortie de l'archive dezippée, on cache ou pas l'extraction, on ecrase ou pas, on fait la recursivité ou non, on inclue les archives, on exclue les archives, on inclue les fichiers, on exclue les fichiers, on met un mot de passe, on repond oui a tout] (je fais simple lol)

Code : Tout sélectionner

_7ZIPExtract(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",0,0,2,1,1,0,0,0) 
donc je pense ne pas me tromper en mettant cela, mais en fait il me mets qu'il y a une errreur à l'extraction de l'archive...

Je ne vois pas ce que rate...
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#50

Message par Sydneysyd »

Je continue au fur et à mesure, et je me rend qu'il me l'erreur au moment où je valide la récursivité dans le code !

Code : Tout sélectionner

 _7ZIPExtract(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",1,0,1,1)
Donc, je ne vois pas pourquoi, il refuse de faire la recursivité, en plus j'ai bien mis les dll là où se trouve le code... Le poste est en 64Bits en W7, je ne pense pas que cela peut bloquer...
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#51

Message par Tlem »

Bonsoir Sydneysyd.
J'ai trouvé d’où vient le problème ...
; Name...........: _7ZIPExtract
; Description ...: Extracts files from archive to the current directory or to the output directory
; Name...........: _7ZIPExtractEx
; Description ...: Extracts files from archive with full paths to the current directory or to the output directory

Et il est inutile de me demander à quoi sert l'option "Recurse" de la première fonction. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#52

Message par Sydneysyd »

Merci Tlem :)

Donc si je comprends bien, je ne peux pas extraire l'archive tel qu'elle est zippée ?
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#53

Message par Tlem »

Heuuu non vous ne comprenez pas bien.
Relisez mon message plusieurs fois. ^^

Envoyé de mon SM-N9005 en utilisant Tapatalk

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#54

Message par Sydneysyd »

J'ai vraiment du mal...

Donc tous les dossiers sont extraits dans le même dossier ?
Quelle commande je fais pour que cela sorte comme dans le zip ?
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#55

Message par Tlem »

Sydneysyd a écrit : sam. 01 juil. 2017 14:43 J'ai vraiment du mal...
Je confirme !
Sydneysyd a écrit : sam. 01 juil. 2017 14:43Quelle commande je fais pour que cela sorte comme dans le zip ?
_7ZIPExtractEx
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#56

Message par Sydneysyd »

Un grand MERCI Tlem !

Code : Tout sélectionner

_7ZIPExtractEx(0, @tempdir & "\EasyCloud\GoogleChrome.7z", @ProgramFilesDir & "\GoogleChrome\",1,0,1,0)
L'extraction se fait correctement :D

Je pense changer mon pseudo pour 'Le boulet' lol

Merci encore
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#57

Message par Tlem »

C'est super, votre projet avance ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Sydneysyd
Niveau 5
Niveau 5
Messages : 177
Enregistré le : jeu. 24 nov. 2011 08:58
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#58

Message par Sydneysyd »

lol, oui, je pense que par rapport au fait que je ne peux pas avoir un exe classique depuis mon poste, la solution de portabilisation n'est pas si mal :

- Installation plus rapide
- Paramètres déjà mis
-Il n'y a qu'en jouant avec les plus forts que l'on progresse-
Avatar du membre
Elementary
Niveau 1
Niveau 1
Messages : 4
Enregistré le : lun. 13 nov. 2017 10:07
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#59

Message par Elementary »

Bonjour toutes et tous !

Tout d'abord merci pour cet UDF très pratique.

Je vais toutefois soulever un problème du code dans la fonction _7ZipStartup() :
Func _7ZipStartup()

   If Not @Compiled Then ; If not compiled, test and open the right dll
      If Not FileExists($sNoCompiledPath & $sZip32Dll) And _
         Not FileExists($sNoCompiledPath & $sZip64Dll) Then Return SetError(2, 0, 0)
      If @OSArch = "X86" Then
         $hDLL_7ZIP = DllOpen($sNoCompiledPath & $sZip32Dll) ; Open x32 dll from no compiled path
      Else
         $hDLL_7ZIP = DllOpen($sNoCompiledPath & $sZip64Dll) ; Open x64 dll from no compiled path
      EndIf
   Else ; If compiled, test and open the right dll (that must be in ScriptDir for compiling)
      If @OSArch = "X86" Then
         If Not FileInstall("7-zip32.dll", $sCompiledPath & $sZip32Dll, 1) Then Return SetError(3, 0, 0)
         $hDLL_7ZIP = DllOpen($sCompiledPath & $sZip32Dll) ; Open x32 dll from FileInstall path
      Else
         If Not FileInstall("7-zip64.dll", $sCompiledPath & $sZip64Dll, 1) Then Return SetError(3, 0, 0)
         $hDLL_7ZIP = DllOpen($sCompiledPath & $sZip64Dll) ; Open x64 dll from FileInstall path
      EndIf
   EndIf

   If $hDLL_7ZIP = -1 Then Return SetError(1, 0, 0) ; If no dll handle, return error

   Return 1

EndFunc   ;==>_7ZipStartup
Si l'OS est en 32 bits pas de problème, la bonne DLL est utilisée, mais lorsque l'OS est en 64 bits et que le programme est en 32 bits le code ne permet pas de charger la bonne DLL et on a une erreur à l'exécution. Je propose donc de remplacer
If @OSArch = "X86" Then
par
If @OSArch = "X86" Or StringInStr(@SystemDir,"SysWOW64") Then
, ce qui donne :
Func _7ZipStartup()

   If Not @Compiled Then ; If not compiled, test and open the right dll
      If Not FileExists($sNoCompiledPath & $sZip32Dll) And _
         Not FileExists($sNoCompiledPath & $sZip64Dll) Then Return SetError(2, 0, 0)
      If @OSArch = "X86" Or StringInStr(@SystemDir,"SysWOW64") Then
         $hDLL_7ZIP = DllOpen($sNoCompiledPath & $sZip32Dll) ; Open x32 dll from no compiled path
      Else
         $hDLL_7ZIP = DllOpen($sNoCompiledPath & $sZip64Dll) ; Open x64 dll from no compiled path
      EndIf
   Else ; If compiled, test and open the right dll (that must be in ScriptDir for compiling)
      If @OSArch = "X86" Or StringInStr(@SystemDir,"SysWOW64") Then
         If Not FileInstall("7-zip32.dll", $sCompiledPath & $sZip32Dll, 1) Then Return SetError(3, 0, 0)
         $hDLL_7ZIP = DllOpen($sCompiledPath & $sZip32Dll) ; Open x32 dll from FileInstall path
      Else
         If Not FileInstall("7-zip64.dll", $sCompiledPath & $sZip64Dll, 1) Then Return SetError(3, 0, 0)
         $hDLL_7ZIP = DllOpen($sCompiledPath & $sZip64Dll) ; Open x64 dll from FileInstall path
      EndIf
   EndIf

   If $hDLL_7ZIP = -1 Then Return SetError(1, 0, 0) ; If no dll handle, return error

   Return 1

EndFunc   ;==>_7ZipStartup
Il s'agit donc de regarder vers quelle bibliothèque système pointe le programme lors de son exécution. De cette manière le fonctionnement est correct aussi bien sur les plateformes 32 bits que sur les 64 bits.

[note du 14-11-2017] : une modification avait déjà été proposée sur autoitscript.com par Mugen :
[Fin de note]

Autre petit problème lorsqu'on ajoute un élément dans le fichier compressé dès lors qu'un mot de passe d'encryptage est utilisé.
Dans le code de la fonction _7ZipAdd on trouve ceci :
   If $sPassword Then $iSwitch &= " -p" & $sPassword & ' -mhe'
on constatera la présence de la commande "-mhe" qui permet l'encodage du HEADER du fichier compressé afin de rendre impossible l'accès au listing du contenu avant la saisie du mot de passe.

Or cette commande ne fonctionne pas en dehors du codage 7Z et TAR, cela créé une erreur.
Ainsi pour le fichier ZIP cette commande ne doit pas être utilisée.

Je propose donc une modification du code de cette manière :
   .......................

   Local $Extention=StringSplit($sArcName,".")
   Local $sCryptHeader=StringInStr("7Z|TAR",StringUpper($Extention[$Extention[0]]))

   $sArcName = '"' & $sArcName & '"'
   $sFileName = '"' & $sFileName & '"'

   .......................

   if $sPassword Then
      $iSwitch &= ' -p"' & $sPassword& '"'
      If $sCryptHeader Then $iSwitch &= ' -mhe'
   EndIf
J'ai rajouté des guillemets pour le password afin de tenir compte des caractères spéciaux éventuels qu'il contiendrait.

Je ne suis arrivé encore à aucune solution sur les autres formats : GZIP, BZIP2.
Mais je ne désespère pas. Je vous laisse donc du travail en perspective :D !

Bonne continuation à vous toutes et tous.
Modifié en dernier par Elementary le mar. 14 nov. 2017 18:54, modifié 3 fois.
Ne jamais remettre à demain ...... ce que l'on peut faire d'une seule ^^ !
Avatar du membre
ricky
Niveau 7
Niveau 7
Messages : 443
Enregistré le : ven. 06 févr. 2009 09:25
Localisation : Suisse
Status : Hors ligne

Re: [UDF] 7-Zip avec Dll x32 et x64

#60

Message par ricky »

Hello,
merci beaucoup pour ton udf et aux nouvelles corrections ci-dessus.
Petite question, les dll de 7zip sont des anciennes, peut-on utiliser les dernières sans avoir des soucis de compatibilité?
Répondre