Commit | Line | Data |
---|---|---|
5ca28f79 L |
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 |