Jump to content
Decipher

7-Zip UDF using MemoryDLL UDF

Recommended Posts

Decipher

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
iHonda

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

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

  • Similar Content

    • DynamicRookie
      By DynamicRookie
      Hey there!
       
      I've been developing a artificial intelligence.

      My first hard task was letting the A.I know when a sentence is found in memory with different words
      What i tried to do here is simply, get all the words in user sentence that could be used
      as a identifier
              
              example: Steve Jobs
              
              then identify the sentence purpose with the words we found in the past "for" loop
              
              example: Do/Know/You/Who/Steve/Jobs
              
              Compare the example in the following matching sentences in memory.
              
              1-Steve jobs was a known person
              2-Do you know who barack obama is?
              3-Do you know Steve jobs?
              4-Do you know who steve jobs is?
              5-How much money steve jobs had
              
              Then find the sentence that has way more matches than the other ones, remember that if the identifier words were not found
              (Steve jobs) then the sentence is invalid.
              
              Every sentence has a different answer and is important that the right one is chosen.
              
      If there's no more than the half of words in matches, then assign a variable the result of function, such as a return but for a global var.
      I couldn't figure out how to do that with StringRegExp.
       
      I honestly need help with detecting identifiers on memory sentences.
      I would also like to let the AI know typos, meaning that moeny and money means the same thing.
      Any help is hugely appreciated.

       
    • FrancescoDiMuro
      By FrancescoDiMuro
      Good morning everyone

      I was playing a little bit with "Screen Capture" UDF, and I was trying to make a "Window" capture, but, since I made a GUI which through I fire the event "Capture", my GUI is captured as well, and I don't want to
      This is the line of code that makes the capture:
       
      _ScreenCapture_CaptureWnd($strScreenCaptureFileName, $objActiveWindow, 0, 0, -1, -1, False) And these are the lines of code which select the "active" window:
       
      Local $objCurrentWindow = 9999 If _IsPressed("01") Then $objCurrentWindow = WinGetHandle("[ACTIVE]") If $objCurrentWindow <> $objMyGUI Then $objActiveWindow = $objCurrentWindow EndIf EndIf Sorry If I made stupid mistakes
      Thanks in advance.

      Francesco
    • robertocm
      By robertocm
      change linked image paths in excel 2007 Open XML Files with AutoIt and 7-zip:
      #include <File.au3> ;Change this Local $sFind = "C:\Users\MyUserName\Documents\MyImageFolder\My%20Image1.png" Local $sReplace = "C:\Users\ANOTHERUSERNAME\Documents\AnotherImageFolder\My%20Image1.png" Local Const $sMessage = "Directory to change excel image paths" Local $sFileSelectFolder = FileSelectFolder($sMessage, "") Local $sTempDir = @ScriptDir & "\testdir" ;Required 7-zip Local $PathZipProgram = @ProgramFilesDir & "\7-Zip\" If Not(FileExists($PathZipProgram & "\7z.exe")) Then MsgBox(16, "", "7z.exe not found in path " & $PathZipProgram) Exit EndIf ;look for excel files in selected directory and all subdirectories Local $SFileList = _FileListToArrayRec($sFileSelectFolder, "*.xls.;*.xlsm", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) If Not @error Then For $i = 1 To $SFileList[0] DirRemove($sTempDir, 1) ;use x command to keep the folder stucture, -aoa Overwrite All existing files without prompt, use -r to unzip the subfolders from the zip file RunWait('"' & $PathZipProgram & '7z.exe" x -aoa -r "' & $SFileList[$i] & '" -o"' & $sTempDir & '" -y', $PathZipProgram, @SW_HIDE) __ReplaceImagePaths($sTempDir, $sFind, $sReplace) RunWait('"' & $PathZipProgram & '7z.exe" a -r "' & $SFileList[$i] & '" "' & $sTempDir & '\*" -tzip -y', $PathZipProgram, @SW_HIDE) Next Else MsgBox(16, "Error", "No files were found in the folder specified.") EndIf DirRemove($sTempDir, 1) Func __ReplaceImagePaths($sTempDir, $sFind, $sReplace) ;List all files with .xml.rels extension in the directory \xl\drawings\_rels Local $aFileList = _FileListToArray($sTempDir & "\xl\drawings\_rels", "*.xml.rels", 1, True) If @error = 1 Then ;MsgBox (0, "", "Path was invalid") SplashTextOn("Title", "Path was invalid", -1, -1, -1, -1, 1, "", 24) Sleep(2000) SplashOff() Exit EndIf If @error = 4 Then ;MsgBox (0, "No files", "No files were found") SplashTextOn("Title", "No files were found", -1, -1, -1, -1, 1, "", 24) Sleep(2000) SplashOff() Exit EndIf Local $iRetval ;Loop through the array For $i = 1 To $aFileList[0] $iRetval = _ReplaceStringInFile($aFileList[$i], $sFind, $sReplace) Next EndFunc  
      Some references:
      https://stackoverflow.com/questions/37145369/change-path-to-picture-links-in-excel http://www.jkp-ads.com/Articles/Excel2007FileFormat.asp EDITED:
      Note: it seems that if User Account Control (UAC) is enabled then 7zip is unable to overwrite the destination file (using the same name).
      In this case, a possible solution would be to rename the original excel file before (see _PathSplit in help file).
      In my case i prefer just to disable UAC
    • kcvinu
      By kcvinu
      Hi all,
      I am playing with _GUICtrlButton_Create function. How can i change this button's (or the entire form's) font ?. The in-built GUICtrlSetFont function is not working even when i convert the control handle to control ID with _WinAPI_GetDlgCtrlID ( ) function.  Do i need to use CreateFont api finction and send WM_SETFONT message ? Or is there any other easy and safe ways to do this ?. Thanks in advance.
      Note : This window is created by CreateWindowEx function, not by GUICreate function. 
    • Kevin Finnegan
      By Kevin Finnegan
      Hi all,
      Long time lurker and now forum poster! I'm writing a relatively simple backup script for my firm that automates the copy, compression and organization of Leaver's data on one of our secured NAS systems. I personally found the best method to do this so far was to use 7zG.exe (GUI version of 7Zip which can use command-line too) and it functions quite well!
      I would like to retrieve more info on whether any warnings or errors happen in 7Zip during the backup, but I can't quite get my head around the syntax and switches for reading out, it seems any adjustment I make to the RunWait call's string seems to break the backup or give unexpected repercussions! Hopefully its something silly I'm doing as I don't code very often.
      Here is the working version:
      ; Compress the directories one by one in the zip using the listfile.... Local $iPID = RunWait(@ScriptDir & "\bin\7zG.exe a -mx" & $compressionQuality & " -v" & $compressSplitFileSize & " -wc:\temp " _ & $backupToLocation & "\" & $userDirectory & ".7z @bin\listfile.txt -x@bin\excludefile.txt", "", @SW_SHOWDEFAULT, $STDOUT_CHILD) Ultimately I would love to switch entirely to 7za.exe (standalone) so that I can read the progress percentage, current file being uploaded and any warnings or errors could be processed and output to the AutoIT script's GUI I've created rather than jumping in and out of two applications per se.
       
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.