| 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@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@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@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@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 |