161 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
See below some functions declarations for Visual Basic.
 | 
						|
 | 
						|
Frequently Asked Question:
 | 
						|
 | 
						|
Q: Each time I use the compress function I get the -5 error (not enough
 | 
						|
   room in the output buffer).
 | 
						|
 | 
						|
A: Make sure that the length of the compressed buffer is passed by
 | 
						|
   reference ("as any"), not by value ("as long"). Also check that
 | 
						|
   before the call of compress this length is equal to the total size of
 | 
						|
   the compressed buffer and not zero.
 | 
						|
 | 
						|
 | 
						|
From: "Jon Caruana" <jon-net@usa.net>
 | 
						|
Subject: Re: How to port zlib declares to vb?
 | 
						|
Date: Mon, 28 Oct 1996 18:33:03 -0600
 | 
						|
 | 
						|
Got the answer! (I haven't had time to check this but it's what I got, and
 | 
						|
looks correct):
 | 
						|
 | 
						|
He has the following routines working:
 | 
						|
        compress
 | 
						|
        uncompress
 | 
						|
        gzopen
 | 
						|
        gzwrite
 | 
						|
        gzread
 | 
						|
        gzclose
 | 
						|
 | 
						|
Declares follow: (Quoted from Carlos Rios <c_rios@sonda.cl>, in Vb4 form)
 | 
						|
 | 
						|
#If Win16 Then   'Use Win16 calls.
 | 
						|
Declare Function compress Lib "ZLIB.DLL" (ByVal compr As
 | 
						|
        String, comprLen As Any, ByVal buf As String, ByVal buflen
 | 
						|
        As Long) As Integer
 | 
						|
Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr
 | 
						|
        As String, uncomprLen As Any, ByVal compr As String, ByVal
 | 
						|
        lcompr As Long) As Integer
 | 
						|
Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As
 | 
						|
        String, ByVal mode As String) As Long
 | 
						|
Declare Function gzread Lib "ZLIB.DLL" (ByVal file As
 | 
						|
        Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
 | 
						|
        As Integer
 | 
						|
Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As
 | 
						|
        Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
 | 
						|
        As Integer
 | 
						|
Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As
 | 
						|
        Long) As Integer
 | 
						|
#Else
 | 
						|
Declare Function compress Lib "ZLIB32.DLL"
 | 
						|
        (ByVal compr As String, comprLen As Any, ByVal buf As
 | 
						|
        String, ByVal buflen As Long) As Integer
 | 
						|
Declare Function uncompress Lib "ZLIB32.DLL"
 | 
						|
        (ByVal uncompr As String, uncomprLen As Any, ByVal compr As
 | 
						|
        String, ByVal lcompr As Long) As Long
 | 
						|
Declare Function gzopen Lib "ZLIB32.DLL"
 | 
						|
        (ByVal file As String, ByVal mode As String) As Long
 | 
						|
Declare Function gzread Lib "ZLIB32.DLL"
 | 
						|
        (ByVal file As Long, ByVal uncompr As String, ByVal
 | 
						|
        uncomprLen As Long) As Long
 | 
						|
Declare Function gzwrite Lib "ZLIB32.DLL"
 | 
						|
        (ByVal file As Long, ByVal uncompr As String, ByVal
 | 
						|
        uncomprLen As Long) As Long
 | 
						|
Declare Function gzclose Lib "ZLIB32.DLL"
 | 
						|
        (ByVal file As Long) As Long
 | 
						|
#End If
 | 
						|
 | 
						|
-Jon Caruana
 | 
						|
jon-net@usa.net
 | 
						|
Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
 | 
						|
 | 
						|
 | 
						|
Here is another example from Michael <michael_borgsys@hotmail.com> that he
 | 
						|
says conforms to the VB guidelines, and that solves the problem of not
 | 
						|
knowing the uncompressed size by storing it at the end of the file:
 | 
						|
 | 
						|
'Calling the functions:
 | 
						|
'bracket meaning: <parameter> [optional] {Range of possible values}
 | 
						|
'Call subCompressFile(<path with filename to compress> [, <path with
 | 
						|
filename to write to>, [level of compression {1..9}]])
 | 
						|
'Call subUncompressFile(<path with filename to compress>)
 | 
						|
 | 
						|
Option Explicit
 | 
						|
Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller'
 | 
						|
Private Const SUCCESS As Long = 0
 | 
						|
Private Const strFilExt As String = ".cpr"
 | 
						|
Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef
 | 
						|
dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long,
 | 
						|
ByVal level As Integer) As Long
 | 
						|
Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef
 | 
						|
dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long)
 | 
						|
As Long
 | 
						|
 | 
						|
Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal
 | 
						|
strargCprFilPth As String, Optional ByVal intLvl As Integer = 9)
 | 
						|
    Dim strCprPth As String
 | 
						|
    Dim lngOriSiz As Long
 | 
						|
    Dim lngCprSiz As Long
 | 
						|
    Dim bytaryOri() As Byte
 | 
						|
    Dim bytaryCpr() As Byte
 | 
						|
    lngOriSiz = FileLen(strargOriFilPth)
 | 
						|
    ReDim bytaryOri(lngOriSiz - 1)
 | 
						|
    Open strargOriFilPth For Binary Access Read As #1
 | 
						|
        Get #1, , bytaryOri()
 | 
						|
    Close #1
 | 
						|
    strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth)
 | 
						|
'Select file path and name
 | 
						|
    strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) =
 | 
						|
strFilExt, "", strFilExt) 'Add file extension if not exists
 | 
						|
    lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit
 | 
						|
more space then original file size
 | 
						|
    ReDim bytaryCpr(lngCprSiz - 1)
 | 
						|
    If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) =
 | 
						|
SUCCESS Then
 | 
						|
        lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100
 | 
						|
        ReDim Preserve bytaryCpr(lngCprSiz - 1)
 | 
						|
        Open strCprPth For Binary Access Write As #1
 | 
						|
            Put #1, , bytaryCpr()
 | 
						|
            Put #1, , lngOriSiz 'Add the the original size value to the end
 | 
						|
(last 4 bytes)
 | 
						|
        Close #1
 | 
						|
    Else
 | 
						|
        MsgBox "Compression error"
 | 
						|
    End If
 | 
						|
    Erase bytaryCpr
 | 
						|
    Erase bytaryOri
 | 
						|
End Sub
 | 
						|
 | 
						|
Public Sub subUncompressFile(ByVal strargFilPth As String)
 | 
						|
    Dim bytaryCpr() As Byte
 | 
						|
    Dim bytaryOri() As Byte
 | 
						|
    Dim lngOriSiz As Long
 | 
						|
    Dim lngCprSiz As Long
 | 
						|
    Dim strOriPth As String
 | 
						|
    lngCprSiz = FileLen(strargFilPth)
 | 
						|
    ReDim bytaryCpr(lngCprSiz - 1)
 | 
						|
    Open strargFilPth For Binary Access Read As #1
 | 
						|
        Get #1, , bytaryCpr()
 | 
						|
    Close #1
 | 
						|
    'Read the original file size value:
 | 
						|
    lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _
 | 
						|
              + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _
 | 
						|
              + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _
 | 
						|
              + bytaryCpr(lngCprSiz - 4)
 | 
						|
    ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value
 | 
						|
    ReDim bytaryOri(lngOriSiz - 1)
 | 
						|
    If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS
 | 
						|
Then
 | 
						|
        strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt))
 | 
						|
        Open strOriPth For Binary Access Write As #1
 | 
						|
            Put #1, , bytaryOri()
 | 
						|
        Close #1
 | 
						|
    Else
 | 
						|
        MsgBox "Uncompression error"
 | 
						|
    End If
 | 
						|
    Erase bytaryCpr
 | 
						|
    Erase bytaryOri
 | 
						|
End Sub
 | 
						|
Public Property Get lngPercentSmaller() As Long
 | 
						|
    lngPercentSmaller = lngpvtPcnSml
 | 
						|
End Property
 |