Jump to content
Sign in to follow this  
Decipher

7-Zip UDF using MemoryDLL UDF

Recommended Posts

I updated the UDF by Patric Pendelin to use the MemoryDLL UDF.

There are only two new functions: _SevenZip_Load & _SevenZip_Free

The first function must be called before using any other functions included in the UDF and the other should be called to free memory when the UDF is no longer needed!

The size of binary from the module was excessive so I used the ZLMA UDF to compress it. It will be decompressed at run time before its loaded into memory.

The only advantage of using this UDF is that it removes the need to included any DLLs in your script.

A lot of functions haven't been added yet! :(

For those that dare: The API for the 7-Zip32.dll module is included in the attachment.

These functions work in the same way you would you use the standalone 7za.exe executable so the Help.chm file applies to these functions aswell.

Thats it, Enjoy! ;)

The code below is a sneak peak at the actually UDF, meaning it dosen't work without the other includes and the embed binary. - Download the attachment. :idea:

#include-once
#include "MemoryDLL.au3"
#include "LZMA.au3"
Global $__7ZIPDLL = Default, $__7ZIPINIT = False

#cs ===============================================================================
    Name:       7-Zip.au3
    Version:    1.0
    Datum:      08.07.2008

    Author: Patric Pendelin eMail: <patric.pendelin (a) gmx.de>
    Modified By: Decipher

    Script Function:

     _SevenZip_Load()
     _SevenZip_Extract($s_Archive, $s_Out="", $s_Pass="", $szCmdLine="", $s_Overwrite="", $hwnd=0, $szOutput="NULL", $dwSize=0) Extracts files from an archive
     _SevenZip_Add($s_Archive, $s_Out = "", $s_Typ = "7z32", $i_Comp = 5, $s_Pass = "", $szCmdLine = "", $hwnd = 0, $szOutput = "NULL", $dwSize = 0) Add files to an archive
     _SevenZip_GetVersion() Get 7_zip32.dll Version
     _SevenZip_GetRunning()
     _SevenZip_CheckArchive($s_Archive, $i_iMode = 0)
     _SevenZip_GetArchiveType($s_Archive)
     _SevenZip_GetFileCount($s_Archive)
     _SevenZip_GetUDFVersion() Returns UDF version number
     _SevenZip_Free()
#ce ===============================================================================

Func _SevenZip_Load()
    If Not $__7ZIPINIT Then
        $__7ZIPDLL = MemoryDllOpen(__7ZIPBIN())
        $__7ZIPINIT = True
    EndIf
EndFunc

Func _SevenZip_Free()
    If $__7ZIPINIT Then
        MemoryDllClose($__7ZIPDLL)
        $__7ZIPINIT = False
        $__7ZIPDLL = Default
    EndIf
EndFunc

;===============================================================================
; Function Name:     _SevenZip_Extract
; Description:      Extracts files from an archive
;
; Parameter(s):     $s_Archive:     Fullpath to Archive-File
;                   $s_Out:         Specifies a destination directory where files are to be extracted. (Def. "")
;                   $s_Pass:        Specifies password. (Def. "")
;                   $szCmdLine:     Command Line Commands. (Def. "")
;                   $s_Overwrite:   Specifies the overwrite mode during extraction, to overwrite files already present on disk. (Def. "")
;                               -1: Overwrite All existing files without prompt.
;                               -2: Skip extracting of existing files.
;                               -3: aUto rename extracting file (for example, name.txt will be renamed to name_1.txt).
;                               -4: auto rename existing file (for example, name.txt will be renamed to name_1.txt).
;                   $hwnd:          The window handle of the application which calls 7-zip32.dll. (Def. 0)
;                   $szOutput:      The buffer because 7-zip32.dll returns the result. (Def. "NULL")
;                   $dwSize:        Größe des Puffers. When the result exceeds designated size, it is economized in this size.
;                                   If size is 1 or more, always NULL letter is added lastly.   (Def. 0)
;
; Syntax:            _SevenZip_Extract($s_Archive, $s_Out="", $s_Pass="", $szCmdLine="", $s_Overwrite="", $hwnd=0, $szOutput="NULL", $dwSize=0)
; Return Value(s):      On Success -Return 1
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_Extract($s_Archive, $s_Out = "", $s_Pass = "", $szCmdLine = "", $s_Overwrite = "", $hwnd = 0, $szOutput = "NULL", $dwSize = 0)
    ; Set Output directory
    If $s_Out = "" Then
        Local $as_Res = StringSplit($s_Archive, "\")
        For $i = 1 To $as_Res[0] - 1
            $s_Out &= $as_Res[$i] & "\"
        Next
    EndIf
    ; (Overwrite mode) switch:
    If $s_Overwrite = 1 Then
        $s_Overwrite = "-aoa"; Overwrite All existing files without prompt.
    ElseIf $s_Overwrite = 2 Then
        $s_Overwrite = "-aos"; Skip extracting of existing files.
    ElseIf $s_Overwrite = 3 Then
        $s_Overwrite = "-aou"; Auto rename extracting file (for example, name.txt will be renamed to name_1.txt).
    ElseIf $s_Overwrite = 4 Then
        $s_Overwrite = "-aot"; Auto rename existing file (for example, name.txt will be renamed to name_1.txt).
    EndIf
    If $szCmdLine = "" Then $szCmdLine = ' x "' & $s_Archive & '" ' & $s_Overwrite & ' -o"' & $s_Out & '" -p"' & $s_Pass & '"'
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZip", "hwnd", $hwnd, "str", $szCmdLine, "str", $szOutput, "int", $dwSize)
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_Extract

;===============================================================================
; Function Name:     _SevenZip_Add
; Description:      Extracts files from an archive
;
; Parameter(s):     $s_Archive:     Fullpath to Archive-File
;                   $s_Out:         Specifies a destination directory where files are to be extracted. (Def. "")
;                   $s_Typ:         Specifies the type of archive.
;                   $i_Comp:        Sets level of compression. [0 | 1 | 3 | 5 | 7 | 9 ]
;                   $s_Pass:        Specifies password. (Def. "")
;                   $szCmdLine:     Command Line Commands. (Def. "")
;                   $hwnd:          The window handle of the application which calls 7-zip32.dll. (Def. 0)
;                   $szOutput:      The buffer because 7-zip32.dll returns the result. (Def. "NULL")
;                   $dwSize:        Größe des Puffers. When the result exceeds designated size, it is economized in this size.
;                                   If size is 1 or more, always NULL letter is added lastly.   (Def. 0)
;
; Syntax:            _SevenZip_Add($s_Archive, $s_Out = "", $s_Typ = "7z32", $i_Comp = 5, $s_Pass = "", $szCmdLine = "", $hwnd = 0, $szOutput = "NULL", $dwSize = 0)
; Return Value(s):      On Success -Return 1
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_Add($s_Archive, $s_Out = "", $s_Typ = "7z32", $i_Comp = 5, $s_Pass = "", $szCmdLine = "", $hwnd = 0, $szOutput = "NULL", $dwSize = 0)
    If $szCmdLine = "" Then
        If $s_Pass = "" Then
            $szCmdLine = '-t' & $s_Typ & ' a "' & $s_Archive & '" "' & $s_Out & '" -mx=' & $i_Comp
        Else
            $szCmdLine = '-t' & $s_Typ & ' a "' & $s_Archive & '" "' & $s_Out & '" -p"' & $s_Pass & '" -mhe=on -mx=' & $i_Comp
        EndIf
    EndIf
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZip", "hwnd", $hwnd, "str", $szCmdLine, "str", $szOutput, "int", $dwSize)
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_Add

;===============================================================================
; Function Name:     _SevenZip_GetVersion
; Description:      The version of 7-zip32.dll is returned.
;
; Parameter(s):     None.
;
; Syntax:            _SevenZip_GetVersion()
; Return Value(s):      On Success -Return File Version
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_GetVersion()
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZipGetVersion")
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_GetVersion

;===============================================================================
; Function Name:     _SevenZip_GetRunning
; Description:      Whether or not presently 7-zip32.dll while operating, you obtain.
;                   Application side before executing API which by all means accompanies file access such as compressing/thawing,
;                   it is necessary to check whether because of this feasibility.
;
; Parameter(s):     None.
;
; Syntax:            _SevenZip_GetRunning()
; Return Value(s):      On Success -Return 1(It is in the midst of executing.)
;                                   Return 0(Is not in the midst of executing, (feasibility).)
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_GetRunning()
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZipGetRunning")
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_GetRunning

;===============================================================================
; Function Name:     _SevenZip_CheckArchive
; Description:      Whether or not presently 7-zip32.dll while operating, you obtain.
;                   As the archive file which the designated file supports
;                   It returns whether or not it is correct.
;
; Parameter(s):     $s_Archive:     Fullpath to Archive file
;
; Syntax:            _SevenZip_CheckArchive($s_Archive)
; Return Value(s):      On Success -Return 1 (At the time of correct archive file.)
;                                   Return 0 (When the file is illegitimate.)
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_CheckArchive($s_Archive, $i_iMode = 0)
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZipCheckArchive", "str", $s_Archive, "int", $i_iMode)
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_CheckArchive

;===============================================================================
; Function Name:     _SevenZip_GetArchiveType
; Description:      Type of the archive file
;
; Parameter(s):     $s_Archive:     Fullpath to Archive file
;
; Syntax:            _SevenZip_GetArchiveType($s_Archive)
; Return Value(s):      On Success -Return 1 (ZIP type)
;                                   Return 2 (7z32 type)
;                                   On Failure -@error
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_GetArchiveType($s_Archive)
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZipGetArchiveType", "str", $s_Archive)
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_GetArchiveType

;===============================================================================
; Function Name:     _SevenZip_GetFileCount
; Description:      Type of the archive file
;
; Parameter(s):     $s_Archive:     The number of files in the Archive file.
;
; Syntax:            _SevenZip_GetFileCount($s_Archive)
; Return Value(s):  On Success -Return Numer of files
;                   On Failure -@error 1:   Can´t opens a DLL file for use in MemoryDllCall.
;                               @error 2:   Error in MemoryDllCall
;
; Author(s):        Patric Pendelin <patric.pendelin (a) gmx.de>
;===============================================================================
Func  _SevenZip_GetFileCount($s_Archive)
    Local $aRet = MemoryDllCall($__7ZIPDLL, "int", "SevenZipGetFileCount", "str", $s_Archive)
    Return SetError(@error, "", $aRet[0])
EndFunc   ;==> _SevenZip_GetFileCount

#region ### BINARY ###
Func __7ZIPBIN()
        #cs
    Name:   7-ZIP32 BINARY Version 9.20.00.02
    Requirements:   Windows9x/Me/NT/200x/XP/Vista/7
    Author:     Akita Minoru ( Http://Akky.Xrea.Jp/support.Html )

Download the Library: 7-Zip-Library.7z

Basic Usage:

#include "7-Zip.au3"

_SevenZip_Load()

Dim $sCommandLine = "Accepts Switches and etc"
_SevenZip_Exec($sCommandLine) ; See the included 7-Zip.chm documentation

_SevenZip_Free()

Exit

Spoiler

censored.jpg

 

Share this post


Link to post
Share on other sites

Just a few questions... the _7zip_Exec that you reference in your example does not exist.  So I figured "ok I'll just use _7zip_Add" but when I was reading the documentation for it it says its for extracting files from the archive rather than creating an archive..... is this just a documentation error or am I crazy?


A great place to start Autoit 1-2-3

Share this post


Link to post
Share on other sites

@Decipher


Hello, may i ask someone to be that kind and provide example how to zip 2 files using this, im sure wonderfull work, that i just can't figure out how to use yet,
i got the attachements, and also got errors with basic example provided by the author, i figured out theres no :

 

_SevenZip_Exec

 

" function, but rather: "_SevenZip_Extract"

however i got errors :

"Return SetError(@error, "", $aRet[0])
Return SetError(@error, "", $aRet^ ERROR"

both when i use mentioned function, or "_SevenZip_CheckArchive"
for example:

 

#include "7-Zip.au3"

_SevenZip_Load()

_SevenZip_CheckArchive("C:\Users\24\Desktop\moto\7-Zip-Library.7z")
MsgBox(4096, "aret", $aRet) ; 
_SevenZip_Free()

Exit


i got LZMA.au3, memorydll.au3 in the folder as well as in the autoit3/include/ and 7-Zip.au3 in the folder

Can i ask for support please?
I just need to unzip .zip files, edit texts and zip again,

Edit:

ok screw it, for the posterity, this works like CHARM:
https://www.autoitscript.com/forum/topic/116565-zip-udf-zipfldrdll-library/?tab=comments#comment-813281


Best Regards!

 
Edited by ruskiem
notaone

Share this post


Link to post
Share on other sites

Just as an FYI, the original poster of this UDF hasn't been here in 5 years.


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By pat4005
      A tiny UDF that can shoot magic packets at your computers to wake them the heck up. All credits to Olish.
      The only parameter it needs to be specified – is your machine's MAC-address (ip address (the second parameter), at which you will be sending magic packet is generating automatically from @IPAddress1 macro)
      Example:
      _WoL_WakeDevice('001CC0CAED7A') ; the second parameter (if necessery) must be a broadcast address of your local network segment (i.e. 192.168.0.255 for a network 192.168.0.0)  
      _WakeOnLan.au3
    • By obiwanceleri
      Good evening! 
      I know this has been done to death in many programming languages and probably even in AutoIt. 
      But couldn't help myself and as a learning challenge I wrote "yet another converter" LOL
      I need your help to test it and show me "the error of my ways" but in a nutshell here's what it can do already (taken from my source file) :
      Converts all zip files recursively into a 7Zip file, with max compression REQUIRES AUTOIT Version 3.3.14.5 + Exact copy with attributes and folder structure + Extensive error checking, including files blocked by anti-virus (by file count) + Can stop process and restart later with the use of a log file + Can pause process (but in between compressing / extracting files) + Creates a .CSV file that can be used to check on compression ratios + Dynamic GUI that enables user to see console while 7zip is working + Gui can be stretched horizontally for long filenames + Up to 5 retries while transfering compressed files + Checks free space (at startup) to make sure you don't kill your OS LOL + Have converted 10,000+ files with no issues in file integrity. + Open to suggestions and program free to modify to your liking + Will eventually be fully modular and configurable (if there is interest for this) + Exit codes so you can have an idea where program went wrong (if it did) + Fully commented so users can tinker away. - Cannot save archive comments. - Not FULLY tested yet, do not use on .zip files that have no backups The program also has a very minimal GUI that can be stretched. Not a huge fan of million-button interfaces.
      I also assume some people running this program will have a 1024x768 monitor so the GUI is made accordingly.
      There is no way I am keeping this script for myself. If this is useful to anybody, feel free to use it and modify it. All I ask is you credit me (as I will credit those who contribute).
      Now here's the issues that are left to fix. Any help is greatly appreciated and I will add your name in the credits if you so wish.
      - For some reason while compression is under way, all my current explorer windows flicker; notably the cut-and-paste part. I can't seem to narrow it down. 
      - Also context menu is closed in explorer every time program compresses / extracts a new file
      - I've added support for retries if, for some reason, AutoIt can't move the converted file. This happened once after 5000-6000 conversions. Now that I've programmed the retries, the process is somewhat slower. It shouldn't affect speed though.  
      - After compressing 10,000+ files (Yes I have that many zip files! Think Mame) I've had a system meltdown. There's a leak somewhere. Am I supposed to close something and I'm not? I've added _IsPressed() lately so closing that .DLL is not the cause of this leak. 
      - Subtracting one array from another was a tricky thing to program (happens when user stops and restarts process), if you can think of a faster way I'm all in.
      Obviously if you find bugs or have suggestions, I'm all ears. 
      Changelog is included in the source file, including credits.
      PLEASE DON'T CONVERT ALL YOUR FILES YET. It's not fully tested (well I tested it but I need others to test too).
       
      Obiwanceleri
      Zip27z_102.au3
    • By Colduction
      Hi AutoIt Scripters/Programmers. I have a question about MIME Tools for Notepad++:
      I've recently found a UDF about Base64 in forum, but they can't decode\encode correctly some emojis , other UTFs and etc. so i decided to use mimeTools.dll of Notepad++ or main site
      My problem is how to use this dll in AutoIt Language?

      I will be happy with your comments and answers❤ Thanks.
    • By MrCreatoR
      This UDF allows to create formatted label using pseudo element RichLabel (RichEdit actually). Formating is set by using special modificator similar to <font> tag in Html.
      Notes: This UDF is a transformation-continuation of related UDF


      Example:
      Download:
      GUIRichLabel_1.2.zip
      Small syntax related fix: GUIRichLabel_1.1.zip
      GUIRichLabel_1.1.zip
       
      History version:
    • By FrancescoDiMuro
      Good morning Forums 
      In these days, I am working on a project that involved me to use some Windows APIs to obtain some information about Terminal Servers.
      I'm doing this using wtsapi32.dll in a VBA Project, but, the lack of knowledge about few things threated in the articles make this quite difficult to
      implement and understand at the same time.
      The most difficult thing I'm facing is "translating" C/C++ functions or struct in VBA when pointers are used, or pointers of pointers, and so on.
      Since VBA seems to not have a pointer type, to make those functions work I need to implement other functions taken from other DLLs, and this confuses me a lot.
      For example, starting from this code, I splitted all the functions and all the definitions to understand why they are there, and why I need to use them.
      At the end, I've found out that the code I was going to implement starting from the functions provided in the Microsoft Docs won't be ever be able to work without some supplementary functions which are not mentioned anywhere.
      So, I was wondering if someone would please point me out to a good and practical exaplanation about pointers (in general) or specifically for VBA, because I need to use them quite often in these days, and I'd like to understand what I am doing.
      Thanks in advance.

      Best Regards and Stay at home 🏡
       
×
×
  • Create New...