Attribute VB_Name = "VBZipBas" Option Explicit '--------------------------------------------------------------- '-- Please Do Not Remove These Comments!!! '--------------------------------------------------------------- '-- Sample VB 6 code to drive zip32z64.dll '-- Based on the code contributed to the Info-ZIP project '-- by Mike Le Voi '-- '-- See the original VB example in a separate directory for '-- more information '-- '-- Use this code at your own risk. Nothing implied or warranted '-- to work on your machine :-) '--------------------------------------------------------------- '-- '-- The Source Code Is Freely Available From Info-ZIP At: '-- ftp://ftp.info-zip.org/pub/infozip/infozip.html '-- '-- A Very Special Thanks To Mr. Mike Le Voi '-- And Mr. Mike White Of The Info-ZIP '-- For Letting Me Use And Modify His Orginal '-- Visual Basic 5.0 Code! Thank You Mike Le Voi. '--------------------------------------------------------------- '--------------------------------------------------------------- ' This example is redesigned to work with Zip32z64.dll compiled from ' Zip 3.0 with Zip64 enabled. This allows for archives with more ' and larger files than allowed in previous versions. ' ' Modified 4/24/2004, 12/4/2007 by Ed Gordon '--------------------------------------------------------------- '--------------------------------------------------------------- ' Usage notes: ' ' This code uses Zip32z64.dll. You DO NOT need to register the ' DLL to use it. You also DO NOT need to reference it in your ' VB project. You DO have to copy the DLL to your SYSTEM ' directory, your VB project directory, or place it in a directory ' on your command PATH. ' ' Note that Zip32z64 is probably not thread safe so you should avoid ' using the dll in multiple threads at the same time without first ' testing for interaction. ' ' All code provided under the Info-Zip license. If you have ' any questions please contact Info-Zip. ' ' April 24 2004 EG ' '--------------------------------------------------------------- '-- C Style argv '-- Holds The Zip Archive Filenames ' ' Max for zFiles just over 8000 as each pointer takes up 4 bytes and ' VB only allows 32 kB of local variables and that includes function ' parameters. - 3/19/2004 EG ' ' Can put names in strZipFileNames instead of using this array, ' which avoids this limit. File names are separated by spaces. ' Enclose names in quotes if include spaces. Public Type ZIPnames zFiles(1 To 100) As String End Type '-- Call Back "String" Public Type ZipCBChar ch(4096) As Byte End Type '-- Version Structure Public Type VerType Major As Byte Minor As Byte PatchLevel As Byte NotUsed As Byte End Type Public Type ZipVerType structlen As Long ' Length Of The Structure Being Passed flag As Long ' Bit 0: is_beta bit 1: uses_zlib Beta As String * 10 ' e.g., "g BETA" or "" date As String * 20 ' e.g., "4 Sep 95" (beta) or "4 September 1995" ZLIB As String * 10 ' e.g., "1.0.5" or NULL encryption As Long ' 0 if encryption not available ZipVersion As VerType os2dllVersion As VerType windllVersion As VerType End Type '-- ZPOPT Is Used To Set The Options In The ZIP32z64.DLL Public Type ZpOpt date As String ' Date in either US 12/31/98 or 1998-12-31 format szRootDir As String ' Root Directory Pathname (Up To 256 Bytes Long) szTempDir As String ' Temp Directory Pathname (Up To 256 Bytes Long) fTemp As Long ' 1 If Temp dir Wanted, Else 0 fSuffix As Long ' Include Suffixes (Not Yet Implemented!) fEncrypt As Long ' 1 If Encryption Wanted, Else 0 fSystem As Long ' 1 To Include System/Hidden Files, Else 0 fVolume As Long ' 1 If Storing Volume Label, Else 0 fExtra As Long ' 1 If Excluding Extra Attributes, Else 0 fNoDirEntries As Long ' 1 If Ignoring Directory Entries (end with /), Else 0 fExcludeDate As Long ' 1 If Excluding Files After Specified Date, Else 0 fIncludeDate As Long ' 1 If Including Files After Specified Date, Else 0 fVerbose As Long ' 1 If Full Messages Wanted, Else 0 fQuiet As Long ' 1 If Minimum Messages Wanted, Else 0 fCRLF_LF As Long ' 1 If Translate CR/LF To LF, Else 0 fLF_CRLF As Long ' 1 If Translate LF To CR/LF, Else 0 fJunkDir As Long ' 1 If Junking Directory Names on entries, Else 0 fGrow As Long ' 1 If Allow Appending To Zip File, Else 0 fForce As Long ' 1 If Making Entries Using DOS File Names, Else 0 fMove As Long ' 1 If Deleting Files Added Or Updated, Else 0 fDeleteEntries As Long ' 1 If Files Passed Have To Be Deleted, Else 0 fUpdate As Long ' 1 If Updating Zip File-Overwrite Only If Newer, Else 0 fFreshen As Long ' 1 If Freshing Zip File-Overwrite Only, Else 0 fJunkSFX As Long ' 1 If Junking SFX Prefix, Else 0 fLatestTime As Long ' 1 If Setting Zip File Time To Time Of Latest File In Archive, Else 0 fComment As Long ' 1 If Putting Comment In Zip File, Else 0 fOffsets As Long ' 1 If Updating Archive Offsets For SFX Files, Else 0 fPrivilege As Long ' 1 If Not Saving Privileges, Else 0 fEncryption As Long ' Read Only Property!!! szSplitSize As String ' Size of split if splitting, Else NULL (empty string) ' This string contains the size that you want to ' split the archive into. i.e. 100 for 100 bytes, ' 2K for 2 k bytes, where K is 1024, m for meg ' and g for gig. szIncludeList As String ' If used, space separated list of Include filename ' patterns where match includes file - put quotes ' around each filename pattern. IncludeListCount As Long ' place filler (not for VB) - (inits to 0) DO NOT USE IncludeList As Long ' place filler (not for VB) - (inits to 0) DO NOT USE szExcludeList As String ' If used, space separated list of Exclude filename ' patterns where match excludes file - put quotes ' around each filename pattern. ExcludeListCount As Long ' place filler (not for VB) - (inits to 0) DO NOT USE ExcludeList As Long ' place filler (not for VB) - (inits to 0) DO NOT USE fRecurse As Long ' 1 (-r), 2 (-R) If Recursing Into Sub-Directories, Else 0 fRepair As Long ' 1 = Fix Archive, 2 = Try Harder To Fix, Else 0 flevel As Byte ' Compression Level - 0 = Stored 6 = Default 9 = Max End Type ' Used by SetZipOptions Public Enum ZipModeType Add = 0 Delete = 1 Update = 2 Freshen = 3 End Enum Public Enum CompressionLevelType c0_NoCompression = 0 c1_Fast = 1 c2_Fast = 2 c3_Fast = 3 c4_Med = 4 c5_Med = 5 c6_Default = 6 c7_Extra = 7 c8_Extra = 8 c9_Max = 9 End Enum Public Enum Translate_LF_Type No_Line_End_Trans = 0 LF_To_CRLF = 1 CRLF_To_LF = 2 End Enum Public Enum RepairType NoRepair = 0 TryFix = 1 TryFixHarder = 2 End Enum Public Enum VerbosenessType Quiet = 0 Normal = 1 Verbose = 2 End Enum Public Enum RecurseType NoRecurse = 0 r_RecurseIntoSubdirectories = 1 R_RecurseUsingPatterns = 2 End Enum '-- This Structure Is Used For The ZIP32z64.DLL Function Callbacks ' Assumes Zip32z64.dll with Zip64 enabled Public Type ZIPUSERFUNCTIONS ZDLLPrnt As Long ' Callback ZIP32z64.DLL Print Function ZDLLCOMMENT As Long ' Callback ZIP32z64.DLL Comment Function ZDLLPASSWORD As Long ' Callback ZIP32z64.DLL Password Function ZDLLSPLIT As Long ' Callback ZIP32z64.DLL Split Select Function ' There are 2 versions of SERVICE, we use one does not need 64-bit data type ZDLLSERVICE As Long ' Callback ZIP32z64.DLL Service Function ZDLLSERVICE_NO_INT64 As Long ' Callback ZIP32z64.DLL Service Function End Type '-- Default encryption password (used in callback if not empty string) Public EncryptionPassword As String '-- For setting the archive comment Public ArchiveCommentText '-- version info Public ZipVersion As ZipVerType '-- Local Declarations Public ZOPT As ZpOpt Public ZUSER As ZIPUSERFUNCTIONS '-- This Assumes ZIP32z64.DLL Is In Your \windows\system directory '-- or a copy is in the program directory or in some other directory '-- listed in PATH Private Declare Function ZpInit Lib "zip32z64.dll" _ (ByRef Zipfun As ZIPUSERFUNCTIONS) As Long '-- Set Zip Callbacks Private Declare Function ZpArchive Lib "zip32z64.dll" _ (ByVal argc As Long, ByVal funame As String, _ ByRef argv As ZIPnames, ByVal strNames As String, ByRef Opts As ZpOpt) As Long '-- Real Zipping Action Private Declare Sub ZpVersion Lib "zip32z64.dll" _ (ByRef ZipVersion As ZipVerType) '-- Version of DLL '------------------------------------------------------- '-- Public Variables For Setting The ZPOPT Structure... '-- (WARNING!!!) You Must Set The Options That You '-- Want The ZIP32.DLL To Do! '-- Before Calling VBZip32! '-- '-- NOTE: See The Above ZPOPT Structure Or The VBZip32 '-- Function, For The Meaning Of These Variables '-- And How To Use And Set Them!!! '-- These Parameters Must Be Set Before The Actual Call '-- To The VBZip32 Function! '------------------------------------------------------- '-- Public Program Variables Public zArgc As Integer ' Number Of Files To Zip Up Public zZipArchiveName As String ' The Zip File Name ie: Myzip.zip Public zZipFileNames As ZIPnames ' File Names To Zip Up Public strZipFileNames As String ' String of names to Zip Up Public zZipInfo As String ' Holds The Zip File Information '-- Public Constants '-- For Zip & UnZip Error Codes! Public Const ZE_OK = 0 ' Success (No Error) Public Const ZE_EOF = 2 ' Unexpected End Of Zip File Error Public Const ZE_FORM = 3 ' Zip File Structure Error Public Const ZE_MEM = 4 ' Out Of Memory Error Public Const ZE_LOGIC = 5 ' Internal Logic Error Public Const ZE_BIG = 6 ' Entry Too Large To Split Error Public Const ZE_NOTE = 7 ' Invalid Comment Format Error Public Const ZE_TEST = 8 ' Zip Test (-T) Failed Or Out Of Memory Error Public Const ZE_ABORT = 9 ' User Interrupted Or Termination Error Public Const ZE_TEMP = 10 ' Error Using A Temp File Public Const ZE_READ = 11 ' Read Or Seek Error Public Const ZE_NONE = 12 ' Nothing To Do Error Public Const ZE_NAME = 13 ' Missing Or Empty Zip File Error Public Const ZE_WRITE = 14 ' Error Writing To A File Public Const ZE_CREAT = 15 ' Could't Open To Write Error Public Const ZE_PARMS = 16 ' Bad Command Line Argument Error Public Const ZE_OPEN = 18 ' Could Not Open A Specified File To Read Error '-- These Functions Are For The ZIP32z64.DLL '-- '-- Puts A Function Pointer In A Structure '-- For Use With Callbacks... Public Function FnPtr(ByVal lp As Long) As Long FnPtr = lp End Function '-- Callback For ZIP32z64.DLL - DLL Print Function Public Function ZDLLPrnt(ByRef fname As ZipCBChar, ByVal x As Long) As Long Dim s0 As String Dim xx As Long '-- Always Put This In Callback Routines! On Error Resume Next s0 = "" '-- Get Zip32.DLL Message For processing For xx = 0 To x If fname.ch(xx) = 0 Then Exit For Else s0 = s0 + Chr(fname.ch(xx)) End If Next '---------------------------------------------- '-- This Is Where The DLL Passes Back Messages '-- To You! You Can Change The Message Printing '-- Below Here! '---------------------------------------------- '-- Display Zip File Information '-- zZipInfo = zZipInfo & s0 Form1.Print s0; DoEvents ZDLLPrnt = 0 End Function '-- Callback For ZIP32z64.DLL - DLL Service Function Public Function ZDLLServ(ByRef mname As ZipCBChar, _ ByVal LowSize As Long, _ ByVal HighSize As Long) As Long Dim s0 As String Dim xx As Long Dim FS As Currency ' for large file sizes '-- Always Put This In Callback Routines! On Error Resume Next FS = (HighSize * &H10000 * &H10000) + LowSize ' Form1.Print "ZDLLServ returned File Size High " & HighSize & _ ' " Low " & LowSize & " = " & FS & " bytes" s0 = "" '-- Get Zip32.DLL Message For processing For xx = 0 To 4096 ' x If mname.ch(xx) = 0 Then Exit For Else s0 = s0 + Chr(mname.ch(xx)) End If Next ' At this point, s0 contains the message passed from the DLL ' It is up to the developer to code something useful here :) ZDLLServ = 0 ' Setting this to 1 will abort the zip! End Function '-- Callback For ZIP32z64.DLL - DLL Password Function Public Function ZDLLPass(ByRef p As ZipCBChar, _ ByVal n As Long, ByRef m As ZipCBChar, _ ByRef Name As ZipCBChar) As Integer Dim filename As String Dim prompt As String Dim xx As Integer Dim szpassword As String '-- Always Put This In Callback Routines! On Error Resume Next ZDLLPass = 1 '-- User Entered A Password So Proccess It '-- Enter or Verify For xx = 0 To 255 If m.ch(xx) = 0 Then Exit For Else prompt = prompt & Chr(m.ch(xx)) End If Next '-- If There Is A Password Have The User Enter It! '-- This Can Be Changed '-- Now skip asking if default password set If EncryptionPassword <> "" Then szpassword = EncryptionPassword Else szpassword = InputBox("Please Enter The Password!", prompt) End If '-- The User Did Not Enter A Password So Exit The Function If szpassword = "" Then Exit Function For xx = 0 To n - 1 p.ch(xx) = 0 Next For xx = 0 To Len(szpassword) - 1 p.ch(xx) = Asc(Mid(szpassword, xx + 1, 1)) Next p.ch(xx) = Chr(0) ' Put Null Terminator For C ZDLLPass = 0 End Function '-- Callback For ZIP32z64.DLL - DLL Comment Function Public Function ZDLLComm(ByRef s1 As ZipCBChar) As Integer Dim comment As String Dim xx%, szcomment$ '-- Always Put This In Callback Routines! On Error Resume Next ZDLLComm = 1 If Not IsEmpty(ArchiveCommentText) Then ' use text given to SetZipOptions szcomment = ArchiveCommentText Else For xx = 0 To 4095 szcomment = szcomment & Chr(s1.ch(xx)) If s1.ch(xx) = 0 Then Exit For End If Next comment = InputBox("Enter or edit the comment", Default:=szcomment) If comment = "" Then ' either empty comment or Cancel button If MsgBox("Remove comment?" & Chr(13) & "Hit No to keep existing comment", vbYesNo) = vbYes Then szcomment = comment Else Exit Function End If End If szcomment = comment End If 'If szcomment = "" Then Exit Function For xx = 0 To Len(szcomment) - 1 s1.ch(xx) = Asc(Mid$(szcomment, xx + 1, 1)) Next xx s1.ch(xx) = 0 ' Put null terminator for C End Function ' This function can be used to set options in VB Public Function SetZipOptions(ByRef ZipOpts As ZpOpt, _ Optional ByVal ZipMode As ZipModeType = Add, _ Optional ByVal RootDirToZipFrom As String = "", _ Optional ByVal CompressionLevel As CompressionLevelType = c6_Default, _ Optional ByVal RecurseSubdirectories As RecurseType = NoRecurse, _ Optional ByVal Verboseness As VerbosenessType = Normal, _ Optional ByVal i_IncludeFiles As String = "", _ Optional ByVal x_ExcludeFiles As String = "", _ Optional ByVal UpdateSFXOffsets As Boolean = False, Optional ByVal JunkDirNames As Boolean = False, _ Optional ByVal Encrypt As Boolean = False, Optional ByVal Password As String = "", _ Optional ByVal Repair As RepairType = NoRepair, Optional ByVal NoDirEntries As Boolean = False, _ Optional ByVal GrowExistingArchive As Boolean = False, _ Optional ByVal JunkSFXPrefix As Boolean = False, Optional ByVal ForceUseOfDOSNames As Boolean = False, _ Optional ByVal Translate_LF As Translate_LF_Type = No_Line_End_Trans, _ Optional ByVal Move_DeleteAfterAddedOrUpdated As Boolean = False, _ Optional ByVal SetZipTimeToLatestTime As Boolean = False, _ Optional ByVal IncludeSystemAndHiddenFiles As Boolean = False, _ Optional ByVal ExcludeEarlierThanDate As String = "", _ Optional ByVal IncludeEarlierThanDate As String = "", _ Optional ByVal IncludeVolumeLabel As Boolean = False, _ Optional ByVal ArchiveComment As Boolean = False, _ Optional ByVal ArchiveCommentTextString = Empty, _ Optional ByVal UsePrivileges As Boolean = False, _ Optional ByVal ExcludeExtraAttributes As Boolean = False, Optional ByVal SplitSize As String = "", _ Optional ByVal TempDirPath As String = "") As Boolean Dim SplitNum As Long Dim SplitMultS As String Dim SplitMult As Long ' set some defaults ZipOpts.date = vbNullString ZipOpts.szRootDir = vbNullString ZipOpts.szTempDir = vbNullString ZipOpts.fTemp = 0 ZipOpts.fSuffix = 0 ZipOpts.fEncrypt = 0 ZipOpts.fSystem = 0 ZipOpts.fVolume = 0 ZipOpts.fExtra = 0 ZipOpts.fNoDirEntries = 0 ZipOpts.fExcludeDate = 0 ZipOpts.fIncludeDate = 0 ZipOpts.fVerbose = 0 ZipOpts.fQuiet = 0 ZipOpts.fCRLF_LF = 0 ZipOpts.fLF_CRLF = 0 ZipOpts.fJunkDir = 0 ZipOpts.fGrow = 0 ZipOpts.fForce = 0 ZipOpts.fMove = 0 ZipOpts.fDeleteEntries = 0 ZipOpts.fUpdate = 0 ZipOpts.fFreshen = 0 ZipOpts.fJunkSFX = 0 ZipOpts.fLatestTime = 0 ZipOpts.fComment = 0 ZipOpts.fOffsets = 0 ZipOpts.fPrivilege = 0 ZipOpts.szSplitSize = vbNullString ZipOpts.IncludeListCount = 0 ZipOpts.szIncludeList = vbNullString ZipOpts.ExcludeListCount = 0 ZipOpts.szExcludeList = vbNullString ZipOpts.fRecurse = 0 ZipOpts.fRepair = 0 ZipOpts.flevel = 0 If RootDirToZipFrom <> "" Then ZipOpts.szRootDir = RootDirToZipFrom End If ZipOpts.flevel = Asc(CompressionLevel) If UpdateSFXOffsets Then ZipOpts.fOffsets = 1 If i_IncludeFiles <> "" Then ZipOpts.szIncludeList = i_IncludeFiles End If If x_ExcludeFiles <> "" Then ZipOpts.szExcludeList = x_ExcludeFiles End If If ZipMode = Add Then ' default ElseIf ZipMode = Delete Then ZipOpts.fDeleteEntries = 1 ElseIf ZipMode = Update Then ZipOpts.fUpdate = 1 Else ZipOpts.fFreshen = 1 End If ZipOpts.fRepair = Repair If GrowExistingArchive Then ZipOpts.fGrow = 1 If Move_DeleteAfterAddedOrUpdated Then ZipOpts.fMove = 1 If Verboseness = Quiet Then ZipOpts.fQuiet = 1 ElseIf Verboseness = Verbose Then ZipOpts.fVerbose = 1 End If If ArchiveComment = False And Not IsEmpty(ArchiveCommentTextString) Then MsgBox "Must set ArchiveComment = True to set ArchiveCommentTextString" Exit Function End If If IsEmpty(ArchiveCommentTextString) Then ArchiveCommentText = Empty Else ArchiveCommentText = ArchiveCommentTextString End If If ArchiveComment Then ZipOpts.fComment = 1 If NoDirEntries Then ZipOpts.fNoDirEntries = 1 If JunkDirNames Then ZipOpts.fJunkDir = 1 If Encrypt Then ZipOpts.fEncrypt = 1 EncryptionPassword = Password If JunkSFXPrefix Then ZipOpts.fJunkSFX = 1 If ForceUseOfDOSNames Then ZipOpts.fForce = 1 If Translate_LF = LF_To_CRLF Then ZipOpts.fLF_CRLF = 1 If Translate_LF = CRLF_To_LF Then ZipOpts.fCRLF_LF = 1 ZipOpts.fRecurse = RecurseSubdirectories If IncludeSystemAndHiddenFiles Then ZipOpts.fSystem = 1 If SetZipTimeToLatestTime Then ZipOpts.fLatestTime = 1 If ExcludeEarlierThanDate <> "" And IncludeEarlierThanDate <> "" Then MsgBox "Both ExcludeEarlierThanDate and IncludeEarlierThanDate not " & Chr(10) & _ "supported at same time" Exit Function End If If ExcludeEarlierThanDate <> "" Then ZipOpts.fIncludeDate = 1 ZipOpts.date = ExcludeEarlierThanDate End If If IncludeEarlierThanDate <> "" Then ZipOpts.fExcludeDate = 1 ZipOpts.date = IncludeEarlierThanDate End If If TempDirPath <> "" Then ZipOpts.szTempDir = TempDirPath ZipOpts.fTemp = 1 End If If SplitSize <> "" Then SplitSize = Trim(SplitSize) SplitMultS = Right(SplitSize, 1) SplitMultS = UCase(SplitMultS) If (SplitMultS = "K") Then SplitMult = 1024 SplitNum = Val(Left(SplitSize, Len(SplitSize) - 1)) ElseIf SplitMultS = "M" Then SplitMult = 1024 * 1024& SplitNum = Val(Left(SplitSize, Len(SplitSize) - 1)) ElseIf SplitMultS = "G" Then SplitMult = 1024 * 1024 * 1024& SplitNum = Val(Left(SplitSize, Len(SplitSize) - 1)) Else SplitMult = 1024 * 1024& SplitNum = Val(SplitSize) End If SplitNum = SplitNum * SplitMult If SplitNum = 0 Then MsgBox "SplitSize of 0 not supported" Exit Function ElseIf SplitNum < 64 * 1024& Then MsgBox "SplitSize must be at least 64k" Exit Function End If ZipOpts.szSplitSize = SplitSize End If If IncludeVolumeLabel Then ZipOpts.fVolume = 1 If UsePrivileges Then ZipOpts.fPrivilege = 1 If ExcludeExtraAttributes Then ZipOpts.fExtra = 1 SetZipOptions = True End Function Function ChopNulls(ByVal Str) As String Dim A As Integer Dim C As String For A = 1 To Len(Str) If Mid(Str, A, 1) = Chr(0) Then ChopNulls = Left(Str, A - 1) Exit Function End If Next ChopNulls = Str End Function Sub DisplayVersion() ' display version of DLL Dim Beta As Boolean Dim ZLIB As Boolean Dim Zip64 As Boolean Dim Flags As String Dim A As Integer ZipVersion.structlen = Len(ZipVersion) ZpVersion ZipVersion ' Check flag If ZipVersion.flag And 1 Then Flags = Flags & " Beta," Beta = True Else Flags = Flags & " No Beta," End If If ZipVersion.flag And 2 Then Flags = Flags & " ZLIB," ZLIB = True Else Flags = Flags & " No ZLIB," End If If ZipVersion.flag And 4 Then Flags = Flags & " Zip64, " Zip64 = True Else Flags = Flags & " No Zip64, " End If If ZipVersion.encryption Then Flags = Flags & "Encryption" Else Flags = Flags & " No encryption" End If Form1.Caption = "Using Zip32z64.DLL Version " & _ ZipVersion.ZipVersion.Major & "." & ZipVersion.ZipVersion.Minor & " " & _ ChopNulls(ZipVersion.Beta) & " [" & ChopNulls(ZipVersion.date) & "]" & _ " - FLAGS: " & Flags If Not Zip64 Then A = MsgBox("Zip32z64.dll not compiled with Zip64 enabled - continue?", _ vbOKCancel, _ "Wrong dll") If A = vbCancel Then End End If End If End Sub '-- Main ZIP32.DLL Subroutine. '-- This Is Where It All Happens!!! '-- '-- (WARNING!) Do Not Change This Function!!! '-- Public Function VBZip32() As Long Dim retcode As Long Dim FileNotFound As Boolean ' On Error Resume Next '-- Nothing Will Go Wrong :-) On Error GoTo ZipError retcode = 0 '-- Set Address Of ZIP32.DLL Callback Functions '-- (WARNING!) Do Not Change!!! (except as noted below) ZUSER.ZDLLPrnt = FnPtr(AddressOf ZDLLPrnt) ZUSER.ZDLLPASSWORD = FnPtr(AddressOf ZDLLPass) ZUSER.ZDLLCOMMENT = FnPtr(AddressOf ZDLLComm) ZUSER.ZDLLSERVICE_NO_INT64 = FnPtr(AddressOf ZDLLServ) ' If you need to set destination of each split set this 'ZUSER.ZDLLSPLIT = FnPtr(AddressOf ZDLLSplitSelect) '-- Set ZIP32.DLL Callbacks - return 1 if DLL loaded 0 if not retcode = ZpInit(ZUSER) If retcode = 0 And FileNotFound Then MsgBox "Probably could not find Zip32z64.DLL - have you copied" & Chr(10) & _ "it to the System directory, your program directory, " & Chr(10) & _ "or a directory on your command PATH?" VBZip32 = retcode Exit Function End If DisplayVersion If strZipFileNames = "" Then ' not using string of names to zip (so using array of names) strZipFileNames = vbNullString End If '-- Go Zip It Them Up! retcode = ZpArchive(zArgc, zZipArchiveName, zZipFileNames, strZipFileNames, ZOPT) '-- Return The Function Code VBZip32 = retcode Exit Function ZipError: MsgBox "Error: " & Err.Description If Err = 48 Then FileNotFound = True End If Resume Next End Function