vbunzip.bas
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:16k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. Attribute VB_Name = "VBUnzBas"
  2. Option Explicit
  3. '-- Please Do Not Remove These Comment Lines!
  4. '----------------------------------------------------------------
  5. '-- Sample VB 5 code to drive unzip32.dll
  6. '-- Contributed to the Info-ZIP project by Mike Le Voi
  7. '--
  8. '-- Contact me at: mlevoi@modemss.brisnet.org.au
  9. '--
  10. '-- Visit my home page at: http://modemss.brisnet.org.au/~mlevoi
  11. '--
  12. '-- Use this code at your own risk. Nothing implied or warranted
  13. '-- to work on your machine :-)
  14. '----------------------------------------------------------------
  15. '--
  16. '-- This Source Code Is Freely Available From The Info-ZIP Project
  17. '-- Web Server At:
  18. '-- http://www.cdrom.com/pub/infozip/infozip.html
  19. '--
  20. '-- A Very Special Thanks To Mr. Mike Le Voi
  21. '-- And Mr. Mike White
  22. '-- And The Fine People Of The Info-ZIP Group
  23. '-- For Letting Me Use And Modify Their Orginal
  24. '-- Visual Basic 5.0 Code! Thank You Mike Le Voi.
  25. '-- For Your Hard Work In Helping Me Get This To Work!!!
  26. '---------------------------------------------------------------
  27. '--
  28. '-- Contributed To The Info-ZIP Project By Raymond L. King.
  29. '-- Modified June 21, 1998
  30. '-- By Raymond L. King
  31. '-- Custom Software Designers
  32. '--
  33. '-- Contact Me At: king@ntplx.net
  34. '-- ICQ 434355
  35. '-- Or Visit Our Home Page At: http://www.ntplx.net/~king
  36. '--
  37. '---------------------------------------------------------------
  38. '--
  39. '-- Modified August 17, 1998
  40. '-- by Christian Spieler
  41. '-- (implemented sort of a "real" user interface)
  42. '--
  43. '---------------------------------------------------------------
  44. '-- C Style argv
  45. Private Type UNZIPnames
  46.   uzFiles(0 To 99) As String
  47. End Type
  48. '-- Callback Large "String"
  49. Private Type UNZIPCBChar
  50.   ch(32800) As Byte
  51. End Type
  52. '-- Callback Small "String"
  53. Private Type UNZIPCBCh
  54.   ch(256) As Byte
  55. End Type
  56. '-- UNZIP32.DLL DCL Structure
  57. Private Type DCLIST
  58.   ExtractOnlyNewer  As Long    ' 1 = Extract Only Newer, Else 0
  59.   SpaceToUnderscore As Long    ' 1 = Convert Space To Underscore, Else 0
  60.   PromptToOverwrite As Long    ' 1 = Prompt To Overwrite Required, Else 0
  61.   fQuiet            As Long    ' 2 = No Messages, 1 = Less, 0 = All
  62.   ncflag            As Long    ' 1 = Write To Stdout, Else 0
  63.   ntflag            As Long    ' 1 = Test Zip File, Else 0
  64.   nvflag            As Long    ' 0 = Extract, 1 = List Zip Contents
  65.   nUflag            As Long    ' 1 = Extract Only Newer, Else 0
  66.   nzflag            As Long    ' 1 = Display Zip File Comment, Else 0
  67.   ndflag            As Long    ' 1 = Honor Directories, Else 0
  68.   noflag            As Long    ' 1 = Overwrite Files, Else 0
  69.   naflag            As Long    ' 1 = Convert CR To CRLF, Else 0
  70.   nZIflag           As Long    ' 1 = Zip Info Verbose, Else 0
  71.   C_flag            As Long    ' 1 = Case Insensitivity, 0 = Case Sensitivity
  72.   fPrivilege        As Long    ' 1 = ACL, 2 = Privileges
  73.   Zip               As String  ' The Zip Filename To Extract Files
  74.   ExtractDir        As String  ' The Extraction Directory, NULL If Extracting To Current Dir
  75. End Type
  76. '-- UNZIP32.DLL Userfunctions Structure
  77. Private Type USERFUNCTION
  78.   UZDLLPrnt     As Long     ' Pointer To Apps Print Function
  79.   UZDLLSND      As Long     ' Pointer To Apps Sound Function
  80.   UZDLLREPLACE  As Long     ' Pointer To Apps Replace Function
  81.   UZDLLPASSWORD As Long     ' Pointer To Apps Password Function
  82.   UZDLLMESSAGE  As Long     ' Pointer To Apps Message Function
  83.   UZDLLSERVICE  As Long     ' Pointer To Apps Service Function (Not Coded!)
  84.   TotalSizeComp As Long     ' Total Size Of Zip Archive
  85.   TotalSize     As Long     ' Total Size Of All Files In Archive
  86.   CompFactor    As Long     ' Compression Factor
  87.   NumMembers    As Long     ' Total Number Of All Files In The Archive
  88.   cchComment    As Integer  ' Flag If Archive Has A Comment!
  89. End Type
  90. '-- UNZIP32.DLL Version Structure
  91. Private Type UZPVER
  92.   structlen       As Long         ' Length Of The Structure Being Passed
  93.   flag            As Long         ' Bit 0: is_beta  bit 1: uses_zlib
  94.   beta            As String * 10  ' e.g., "g BETA" or ""
  95.   date            As String * 20  ' e.g., "4 Sep 95" (beta) or "4 September 1995"
  96.   zlib            As String * 10  ' e.g., "1.0.5" or NULL
  97.   unzip(1 To 4)   As Byte         ' Version Type Unzip
  98.   zipinfo(1 To 4) As Byte         ' Version Type Zip Info
  99.   os2dll          As Long         ' Version Type OS2 DLL
  100.   windll(1 To 4)  As Byte         ' Version Type Windows DLL
  101. End Type
  102. '-- This Assumes UNZIP32.DLL Is In Your WindowsSystem Directory!
  103. Private Declare Function Wiz_SingleEntryUnzip Lib "unzip32.dll" _
  104.   (ByVal ifnc As Long, ByRef ifnv As UNZIPnames, _
  105.    ByVal xfnc As Long, ByRef xfnv As UNZIPnames, _
  106.    dcll As DCLIST, Userf As USERFUNCTION) As Long
  107. Private Declare Sub UzpVersion2 Lib "unzip32.dll" (uzpv As UZPVER)
  108. '-- Private Variables For Structure Access
  109. Private UZDCL  As DCLIST
  110. Private UZUSER As USERFUNCTION
  111. Private UZVER  As UZPVER
  112. '-- Public Variables For Setting The
  113. '-- UNZIP32.DLL DCLIST Structure
  114. '-- These Must Be Set Before The Actual Call To VBUnZip32
  115. Public uExtractNewer     As Integer  ' 1 = Extract Only Newer, Else 0
  116. Public uSpaceUnderScore  As Integer  ' 1 = Convert Space To Underscore, Else 0
  117. Public uPromptOverWrite  As Integer  ' 1 = Prompt To Overwrite Required, Else 0
  118. Public uQuiet            As Integer  ' 2 = No Messages, 1 = Less, 0 = All
  119. Public uWriteStdOut      As Integer  ' 1 = Write To Stdout, Else 0
  120. Public uTestZip          As Integer  ' 1 = Test Zip File, Else 0
  121. Public uExtractList      As Integer  ' 0 = Extract, 1 = List Contents
  122. Public uExtractOnlyNewer As Integer  ' 1 = Extract Only Newer, Else 0
  123. Public uDisplayComment   As Integer  ' 1 = Display Zip File Comment, Else 0
  124. Public uHonorDirectories As Integer  ' 1 = Honor Directories, Else 0
  125. Public uOverWriteFiles   As Integer  ' 1 = Overwrite Files, Else 0
  126. Public uConvertCR_CRLF   As Integer  ' 1 = Convert CR To CRLF, Else 0
  127. Public uVerbose          As Integer  ' 1 = Zip Info Verbose
  128. Public uCaseSensitivity  As Integer  ' 1 = Case Insensitivity, 0 = Case Sensitivity
  129. Public uPrivilege        As Integer  ' 1 = ACL, 2 = Privileges, Else 0
  130. Public uZipFileName      As String   ' The Zip File Name
  131. Public uExtractDir       As String   ' Extraction Directory, Null If Current Directory
  132. '-- Public Program Variables
  133. Public uZipNumber    As Long         ' Zip File Number
  134. Public uNumberFiles  As Long         ' Number Of Files
  135. Public uNumberXFiles As Long         ' Number Of Extracted Files
  136. Public uZipMessage   As String       ' For Zip Message
  137. Public uZipInfo      As String       ' For Zip Information
  138. Public uZipNames     As UNZIPnames   ' Names Of Files To Unzip
  139. Public uExcludeNames As UNZIPnames   ' Names Of Zip Files To Exclude
  140. Public uVbSkip       As Integer      ' For DLL Password Function
  141. '-- Puts A Function Pointer In A Structure
  142. '-- For Callbacks.
  143. Public Function FnPtr(ByVal lp As Long) As Long
  144.   FnPtr = lp
  145. End Function
  146. '-- Callback For UNZIP32.DLL - Receive Message Function
  147. Public Sub UZReceiveDLLMessage(ByVal ucsize As Long, _
  148.     ByVal csiz As Long, _
  149.     ByVal cfactor As Integer, _
  150.     ByVal mo As Integer, _
  151.     ByVal dy As Integer, _
  152.     ByVal yr As Integer, _
  153.     ByVal hh As Integer, _
  154.     ByVal mm As Integer, _
  155.     ByVal c As Byte, ByRef fname As UNZIPCBCh, _
  156.     ByRef meth As UNZIPCBCh, ByVal crc As Long, _
  157.     ByVal fCrypt As Byte)
  158.   Dim s0     As String
  159.   Dim xx     As Long
  160.   Dim strout As String * 80
  161.   '-- Always Put This In Callback Routines!
  162.   On Error Resume Next
  163.   '------------------------------------------------
  164.   '-- This Is Where The Received Messages Are
  165.   '-- Printed Out And Displayed.
  166.   '-- You Can Modify Below!
  167.   '------------------------------------------------
  168.   strout = Space(80)
  169.   '-- For Zip Message Printing
  170.   If uZipNumber = 0 Then
  171.     Mid(strout, 1, 50) = "Filename:"
  172.     Mid(strout, 53, 4) = "Size"
  173.     Mid(strout, 62, 4) = "Date"
  174.     Mid(strout, 71, 4) = "Time"
  175.     uZipMessage = strout & vbNewLine
  176.     strout = Space(80)
  177.   End If
  178.   s0 = ""
  179.   '-- Do Not Change This For Next!!!
  180.   For xx = 0 To 255
  181.     If fname.ch(xx) = 0 Then Exit For
  182.     s0 = s0 & Chr(fname.ch(xx))
  183.   Next
  184.   '-- Assign Zip Information For Printing
  185.   Mid(strout, 1, 50) = Mid(s0, 1, 50)
  186.   Mid(strout, 51, 7) = Right("        " & Str(ucsize), 7)
  187.   Mid(strout, 60, 3) = Right("0" & Trim(Str(mo)), 2) & "/"
  188.   Mid(strout, 63, 3) = Right("0" & Trim(Str(dy)), 2) & "/"
  189.   Mid(strout, 66, 2) = Right("0" & Trim(Str(yr)), 2)
  190.   Mid(strout, 70, 3) = Right(Str(hh), 2) & ":"
  191.   Mid(strout, 73, 2) = Right("0" & Trim(Str(mm)), 2)
  192.   ' Mid(strout, 75, 2) = Right(" " & Str(cfactor), 2)
  193.   ' Mid(strout, 78, 8) = Right("        " & Str(csiz), 8)
  194.   ' s0 = ""
  195.   ' For xx = 0 To 255
  196.   '     If meth.ch(xx) = 0 Then exit for
  197.   '     s0 = s0 & Chr(meth.ch(xx))
  198.   ' Next xx
  199.   '-- Do Not Modify Below!!!
  200.   uZipMessage = uZipMessage & strout & vbNewLine
  201.   uZipNumber = uZipNumber + 1
  202. End Sub
  203. '-- Callback For UNZIP32.DLL - Print Message Function
  204. Public Function UZDLLPrnt(ByRef fname As UNZIPCBChar, ByVal x As Long) As Long
  205.   Dim s0 As String
  206.   Dim xx As Long
  207.   '-- Always Put This In Callback Routines!
  208.   On Error Resume Next
  209.   s0 = ""
  210.   '-- Gets The UNZIP32.DLL Message For Displaying.
  211.   For xx = 0 To x - 1
  212.     If fname.ch(xx) = 0 Then Exit For
  213.     s0 = s0 & Chr(fname.ch(xx))
  214.   Next
  215.   '-- Assign Zip Information
  216.   If Mid$(s0, 1, 1) = vbLf Then s0 = vbNewLine ' Damn UNIX :-)
  217.   uZipInfo = uZipInfo & s0
  218.   UZDLLPrnt = 0
  219. End Function
  220. '-- Callback For UNZIP32.DLL - DLL Service Function
  221. Public Function UZDLLServ(ByRef mname As UNZIPCBChar, ByVal x As Long) As Long
  222.     Dim s0 As String
  223.     Dim xx As Long
  224.     
  225.     '-- Always Put This In Callback Routines!
  226.     On Error Resume Next
  227.     
  228.     s0 = ""
  229.     '-- Get Zip32.DLL Message For processing
  230.     For xx = 0 To x - 1
  231.         If mname.ch(xx) = 0 Then Exit For
  232.         s0 = s0 + Chr(mname.ch(xx))
  233.     Next
  234.     ' At this point, s0 contains the message passed from the DLL
  235.     ' It is up to the developer to code something useful here :)
  236.     UZDLLServ = 0 ' Setting this to 1 will abort the zip!
  237. End Function
  238. '-- Callback For UNZIP32.DLL - Password Function
  239. Public Function UZDLLPass(ByRef p As UNZIPCBCh, _
  240.   ByVal n As Long, ByRef m As UNZIPCBCh, _
  241.   ByRef Name As UNZIPCBCh) As Integer
  242.   Dim prompt     As String
  243.   Dim xx         As Integer
  244.   Dim szpassword As String
  245.   '-- Always Put This In Callback Routines!
  246.   On Error Resume Next
  247.   UZDLLPass = 1
  248.   If uVbSkip = 1 Then Exit Function
  249.   '-- Get The Zip File Password
  250.   szpassword = InputBox("Please Enter The Password!")
  251.   '-- No Password So Exit The Function
  252.   If szpassword = "" Then
  253.     uVbSkip = 1
  254.     Exit Function
  255.   End If
  256.   '-- Zip File Password So Process It
  257.   For xx = 0 To 255
  258.     If m.ch(xx) = 0 Then
  259.       Exit For
  260.     Else
  261.       prompt = prompt & Chr(m.ch(xx))
  262.     End If
  263.   Next
  264.   For xx = 0 To n - 1
  265.     p.ch(xx) = 0
  266.   Next
  267.   For xx = 0 To Len(szpassword) - 1
  268.     p.ch(xx) = Asc(Mid(szpassword, xx + 1, 1))
  269.   Next
  270.   p.ch(xx) = Chr(0) ' Put Null Terminator For C
  271.   UZDLLPass = 0
  272. End Function
  273. '-- Callback For UNZIP32.DLL - Report Function To Overwrite Files.
  274. '-- This Function Will Display A MsgBox Asking The User
  275. '-- If They Would Like To Overwrite The Files.
  276. Public Function UZDLLRep(ByRef fname As UNZIPCBChar) As Long
  277.   Dim s0 As String
  278.   Dim xx As Long
  279.   '-- Always Put This In Callback Routines!
  280.   On Error Resume Next
  281.   UZDLLRep = 100 ' 100 = Do Not Overwrite - Keep Asking User
  282.   s0 = ""
  283.   For xx = 0 To 255
  284.     If fname.ch(xx) = 0 Then xx = 99999 Else s0 = s0 & Chr(fname.ch(xx))
  285.   Next
  286.   '-- This Is The MsgBox Code
  287.   xx = MsgBox("Overwrite " & s0 & "?", vbExclamation & vbYesNoCancel, _
  288.               "VBUnZip32 - File Already Exists!")
  289.   If xx = vbNo Then Exit Function
  290.   If xx = vbCancel Then
  291.     UZDLLRep = 104       ' 104 = Overwrite None
  292.     Exit Function
  293.   End If
  294.   UZDLLRep = 102         ' 102 = Overwrite 103 = Overwrite All
  295. End Function
  296. '-- ASCIIZ To String Function
  297. Public Function szTrim(szString As String) As String
  298.   Dim pos As Integer
  299.   Dim ln  As Integer
  300.   pos = InStr(szString, Chr(0))
  301.   ln = Len(szString)
  302.   Select Case pos
  303.     Case Is > 1
  304.       szTrim = Trim(Left(szString, pos - 1))
  305.     Case 1
  306.       szTrim = ""
  307.     Case Else
  308.       szTrim = Trim(szString)
  309.   End Select
  310. End Function
  311. '-- Main UNZIP32.DLL UnZip32 Subroutine
  312. '-- (WARNING!) Do Not Change!
  313. Public Sub VBUnZip32()
  314.   Dim retcode As Long
  315.   Dim MsgStr As String
  316.   '-- Set The UNZIP32.DLL Options
  317.   '-- (WARNING!) Do Not Change
  318.   UZDCL.ExtractOnlyNewer = uExtractNewer     ' 1 = Extract Only Newer
  319.   UZDCL.SpaceToUnderscore = uSpaceUnderScore ' 1 = Convert Space To Underscore
  320.   UZDCL.PromptToOverwrite = uPromptOverWrite ' 1 = Prompt To Overwrite Required
  321.   UZDCL.fQuiet = uQuiet                      ' 2 = No Messages 1 = Less 0 = All
  322.   UZDCL.ncflag = uWriteStdOut                ' 1 = Write To Stdout
  323.   UZDCL.ntflag = uTestZip                    ' 1 = Test Zip File
  324.   UZDCL.nvflag = uExtractList                ' 0 = Extract 1 = List Contents
  325.   UZDCL.nUflag = uExtractOnlyNewer           ' 1 = Extract Only Newer
  326.   UZDCL.nzflag = uDisplayComment             ' 1 = Display Zip File Comment
  327.   UZDCL.ndflag = uHonorDirectories           ' 1 = Honour Directories
  328.   UZDCL.noflag = uOverWriteFiles             ' 1 = Overwrite Files
  329.   UZDCL.naflag = uConvertCR_CRLF             ' 1 = Convert CR To CRLF
  330.   UZDCL.nZIflag = uVerbose                   ' 1 = Zip Info Verbose
  331.   UZDCL.C_flag = uCaseSensitivity            ' 1 = Case insensitivity, 0 = Case Sensitivity
  332.   UZDCL.fPrivilege = uPrivilege              ' 1 = ACL 2 = Priv
  333.   UZDCL.Zip = uZipFileName                   ' ZIP Filename
  334.   UZDCL.ExtractDir = uExtractDir             ' Extraction Directory, NULL If Extracting
  335.                                              ' To Current Directory
  336.   '-- Set Callback Addresses
  337.   '-- (WARNING!!!) Do Not Change
  338.   UZUSER.UZDLLPrnt = FnPtr(AddressOf UZDLLPrnt)
  339.   UZUSER.UZDLLSND = 0&    '-- Not Supported
  340.   UZUSER.UZDLLREPLACE = FnPtr(AddressOf UZDLLRep)
  341.   UZUSER.UZDLLPASSWORD = FnPtr(AddressOf UZDLLPass)
  342.   UZUSER.UZDLLMESSAGE = FnPtr(AddressOf UZReceiveDLLMessage)
  343.   UZUSER.UZDLLSERVICE = FnPtr(AddressOf UZDLLServ)
  344.   '-- Set UNZIP32.DLL Version Space
  345.   '-- (WARNING!!!) Do Not Change
  346.   With UZVER
  347.     .structlen = Len(UZVER)
  348.     .beta = Space(9) & vbNullChar
  349.     .date = Space(19) & vbNullChar
  350.     .zlib = Space(9) & vbNullChar
  351.   End With
  352.   '-- Get Version
  353.   Call UzpVersion2(UZVER)
  354.   '--------------------------------------
  355.   '-- You Can Change This For Displaying
  356.   '-- The Version Information!
  357.   '--------------------------------------
  358.   MsgStr$ = "DLL Date: " & szTrim(UZVER.date)
  359.   MsgStr$ = MsgStr$ & vbNewLine$ & "Zip Info: " & Hex(UZVER.zipinfo(1)) & "." & _
  360.        Hex(UZVER.zipinfo(2)) & Hex(UZVER.zipinfo(3))
  361.   MsgStr$ = MsgStr$ & vbNewLine$ & "DLL Version: " & Hex(UZVER.windll(1)) & "." & _
  362.        Hex(UZVER.windll(2)) & Hex(UZVER.windll(3))
  363.   MsgStr$ = MsgStr$ & vbNewLine$ & "--------------"
  364.   '-- End Of Version Information.
  365.   '-- Go UnZip The Files! (Do Not Change Below!!!)
  366.   '-- This Is The Actual UnZip Routine
  367.   retcode = Wiz_SingleEntryUnzip(uNumberFiles, uZipNames, uNumberXFiles, _
  368.                                  uExcludeNames, UZDCL, UZUSER)
  369.   '---------------------------------------------------------------
  370.   '-- If There Is An Error Display A MsgBox!
  371.   If retcode <> 0 Then MsgBox retcode
  372.   '-- You Can Change This As Needed!
  373.   '-- For Compression Information
  374.   MsgStr$ = MsgStr$ & vbNewLine$ & "Only Shows If uExtractList = 1 List Contents"
  375.   MsgStr$ = MsgStr$ & vbNewLine$ & "--------------"
  376.   MsgStr$ = MsgStr$ & vbNewLine$ & "Comment         : " & UZUSER.cchComment
  377.   MsgStr$ = MsgStr$ & vbNewLine$ & "Total Size Comp : " & UZUSER.TotalSizeComp
  378.   MsgStr$ = MsgStr$ & vbNewLine$ & "Total Size      : " & UZUSER.TotalSize
  379.   MsgStr$ = MsgStr$ & vbNewLine$ & "Compress Factor : %" & UZUSER.CompFactor
  380.   MsgStr$ = MsgStr$ & vbNewLine$ & "Num Of Members  : " & UZUSER.NumMembers
  381.   MsgStr$ = MsgStr$ & vbNewLine$ & "--------------"
  382.   VBUnzFrm.MsgOut.Text = VBUnzFrm.MsgOut.Text & MsgStr$ & vbNewLine$
  383. End Sub