Page 3 sur 4
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : mar. 16 févr. 2016 14:44
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
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : mer. 17 févr. 2016 12:06
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
Code : Tout sélectionner
7-Zip (a) [32] 15.14 : Copyright (c) 1999-2015 Igor Pavlov : 2015-12-31
Usage: 7za <command> [<switches>...] <archive_name> [<file_names>...]
[<@listfiles...>]
<Commands>
a : Add files to archive
b : Benchmark
d : Delete files from archive
e : Extract files from archive (without using directory names)
h : Calculate hash values for files
i : Show information about supported formats
l : List contents of archive
rn : Rename files in archive
t : Test integrity of archive
u : Update files to archive
x : eXtract files with full paths
<Switches>
-- : Stop switches parsing
-ai[r[-|0]]{@listfile|!wildcard} : Include archives
-ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
-ao{a|s|t|u} : set Overwrite mode
-an : disable archive_name field
-bb[0-3] : set output log level
-bd : disable progress indicator
-bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
-bt : show execution time statistics
-i[r[-|0]]{@listfile|!wildcard} : Include filenames
-m{Parameters} : set compression Method
-mmt[N] : set number of CPU threads
-o{Directory} : set Output directory
-p{Password} : set Password
-r[-|0] : Recurse subdirectories
-sa{a|e|s} : set Archive name mode
-scc{UTF-8|WIN|DOS} : set charset for for console input/output
-scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
-scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
-sdel : delete files after compression
-seml[.] : send archive by email
-sfx[{name}] : Create SFX archive
-si[{name}] : read data from stdin
-slp : set Large Pages mode
-slt : show technical information for l (List) command
-snh : store hard links as links
-snl : store symbolic links as links
-sni : store NT security information
-sns[-] : store NTFS alternate streams
-so : write data to stdout
-spd : disable wildcard matching for file names
-spe : eliminate duplication of root folder for extract command
-spf : use fully qualified file paths
-ssc[-] : set sensitive case mode
-ssw : compress shared files
-stl : set archive timestamp from the most recently modified file
-stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
-stx{Type} : exclude archive type
-t{Type} : Set type of archive
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
-v{Size}[b|k|m|g] : Create volumes
-w[{path}] : assign Work directory. Empty path means a temporary directory
-x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
-y : assume Yes on all queries
ps: il y a eu une MAJ en décembre 2015
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : mer. 17 févr. 2016 16:21
par Cautex
Bonjour walkson,
merci, je vais suivre ton conseil.
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 00:49
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
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 01:33
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.
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 07:40
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...
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 13:11
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...
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 19:01
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
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 22:40
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...
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 22:47
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...
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : ven. 30 juin 2017 23:45
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. ^^
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 10:49
par Sydneysyd
Merci Tlem
Donc si je comprends bien, je ne peux pas extraire l'archive tel qu'elle est zippée ?
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 11:23
par Tlem
Heuuu non vous ne comprenez pas bien.
Relisez mon message plusieurs fois. ^^
Envoyé de mon SM-N9005 en utilisant Tapatalk
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 14:43
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 ?
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 15:06
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
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 15:17
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
Je pense changer mon pseudo pour 'Le boulet' lol
Merci encore
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 15:19
par Tlem
C'est super, votre projet avance ...
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : sam. 01 juil. 2017 18:45
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
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : lun. 13 nov. 2017 11:06
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 1EndFunc ;==>_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
par
, 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 1EndFunc ;==>_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
!
Bonne continuation à vous toutes et tous.
Re: [UDF] 7-Zip avec Dll x32 et x64
Posté : lun. 13 nov. 2017 13:01
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é?