Home | History | Annotate | Download | only in old
      1 See below some functions declarations for Visual Basic.
      2 
      3 Frequently Asked Question:
      4 
      5 Q: Each time I use the compress function I get the -5 error (not enough
      6    room in the output buffer).
      7 
      8 A: Make sure that the length of the compressed buffer is passed by
      9    reference ("as any"), not by value ("as long"). Also check that
     10    before the call of compress this length is equal to the total size of
     11    the compressed buffer and not zero.
     12 
     13 
     14 From: "Jon Caruana" <jon-net (a] usa.net>
     15 Subject: Re: How to port zlib declares to vb?
     16 Date: Mon, 28 Oct 1996 18:33:03 -0600
     17 
     18 Got the answer! (I haven't had time to check this but it's what I got, and
     19 looks correct):
     20 
     21 He has the following routines working:
     22         compress
     23         uncompress
     24         gzopen
     25         gzwrite
     26         gzread
     27         gzclose
     28 
     29 Declares follow: (Quoted from Carlos Rios <c_rios (a] sonda.cl>, in Vb4 form)
     30 
     31 #If Win16 Then   'Use Win16 calls.
     32 Declare Function compress Lib "ZLIB.DLL" (ByVal compr As
     33         String, comprLen As Any, ByVal buf As String, ByVal buflen
     34         As Long) As Integer
     35 Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr
     36         As String, uncomprLen As Any, ByVal compr As String, ByVal
     37         lcompr As Long) As Integer
     38 Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As
     39         String, ByVal mode As String) As Long
     40 Declare Function gzread Lib "ZLIB.DLL" (ByVal file As
     41         Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
     42         As Integer
     43 Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As
     44         Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
     45         As Integer
     46 Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As
     47         Long) As Integer
     48 #Else
     49 Declare Function compress Lib "ZLIB32.DLL"
     50         (ByVal compr As String, comprLen As Any, ByVal buf As
     51         String, ByVal buflen As Long) As Integer
     52 Declare Function uncompress Lib "ZLIB32.DLL"
     53         (ByVal uncompr As String, uncomprLen As Any, ByVal compr As
     54         String, ByVal lcompr As Long) As Long
     55 Declare Function gzopen Lib "ZLIB32.DLL"
     56         (ByVal file As String, ByVal mode As String) As Long
     57 Declare Function gzread Lib "ZLIB32.DLL"
     58         (ByVal file As Long, ByVal uncompr As String, ByVal
     59         uncomprLen As Long) As Long
     60 Declare Function gzwrite Lib "ZLIB32.DLL"
     61         (ByVal file As Long, ByVal uncompr As String, ByVal
     62         uncomprLen As Long) As Long
     63 Declare Function gzclose Lib "ZLIB32.DLL"
     64         (ByVal file As Long) As Long
     65 #End If
     66 
     67 -Jon Caruana
     68 jon-net (a] usa.net
     69 Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
     70 
     71 
     72 Here is another example from Michael <michael_borgsys (a] hotmail.com> that he
     73 says conforms to the VB guidelines, and that solves the problem of not
     74 knowing the uncompressed size by storing it at the end of the file:
     75 
     76 'Calling the functions:
     77 'bracket meaning: <parameter> [optional] {Range of possible values}
     78 'Call subCompressFile(<path with filename to compress> [, <path with
     79 filename to write to>, [level of compression {1..9}]])
     80 'Call subUncompressFile(<path with filename to compress>)
     81 
     82 Option Explicit
     83 Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller'
     84 Private Const SUCCESS As Long = 0
     85 Private Const strFilExt As String = ".cpr"
     86 Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef
     87 dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long,
     88 ByVal level As Integer) As Long
     89 Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef
     90 dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long)
     91 As Long
     92 
     93 Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal
     94 strargCprFilPth As String, Optional ByVal intLvl As Integer = 9)
     95     Dim strCprPth As String
     96     Dim lngOriSiz As Long
     97     Dim lngCprSiz As Long
     98     Dim bytaryOri() As Byte
     99     Dim bytaryCpr() As Byte
    100     lngOriSiz = FileLen(strargOriFilPth)
    101     ReDim bytaryOri(lngOriSiz - 1)
    102     Open strargOriFilPth For Binary Access Read As #1
    103         Get #1, , bytaryOri()
    104     Close #1
    105     strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth)
    106 'Select file path and name
    107     strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) =
    108 strFilExt, "", strFilExt) 'Add file extension if not exists
    109     lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit
    110 more space then original file size
    111     ReDim bytaryCpr(lngCprSiz - 1)
    112     If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) =
    113 SUCCESS Then
    114         lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100
    115         ReDim Preserve bytaryCpr(lngCprSiz - 1)
    116         Open strCprPth For Binary Access Write As #1
    117             Put #1, , bytaryCpr()
    118             Put #1, , lngOriSiz 'Add the the original size value to the end
    119 (last 4 bytes)
    120         Close #1
    121     Else
    122         MsgBox "Compression error"
    123     End If
    124     Erase bytaryCpr
    125     Erase bytaryOri
    126 End Sub
    127 
    128 Public Sub subUncompressFile(ByVal strargFilPth As String)
    129     Dim bytaryCpr() As Byte
    130     Dim bytaryOri() As Byte
    131     Dim lngOriSiz As Long
    132     Dim lngCprSiz As Long
    133     Dim strOriPth As String
    134     lngCprSiz = FileLen(strargFilPth)
    135     ReDim bytaryCpr(lngCprSiz - 1)
    136     Open strargFilPth For Binary Access Read As #1
    137         Get #1, , bytaryCpr()
    138     Close #1
    139     'Read the original file size value:
    140     lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _
    141               + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _
    142               + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _
    143               + bytaryCpr(lngCprSiz - 4)
    144     ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value
    145     ReDim bytaryOri(lngOriSiz - 1)
    146     If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS
    147 Then
    148         strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt))
    149         Open strOriPth For Binary Access Write As #1
    150             Put #1, , bytaryOri()
    151         Close #1
    152     Else
    153         MsgBox "Uncompression error"
    154     End If
    155     Erase bytaryCpr
    156     Erase bytaryOri
    157 End Sub
    158 Public Property Get lngPercentSmaller() As Long
    159     lngPercentSmaller = lngpvtPcnSml
    160 End Property
    161