http://blog.jinesc.net/upload/用VB制作gzip代码_l8.rar
[HR][/HR]
Option Explicit 
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) 
Private Declare Function InitDecompression Lib "gzip.dll" () As Long 
Private Declare Function CreateDecompression Lib "gzip.dll" (ByRef context As Long, ByVal Flags As Long) As Long 
Private Declare Function DestroyDecompression Lib "gzip.dll" (ByRef context As Long) As Long 
Private Declare Function Decompress Lib "gzip.dll" (ByVal context As Long, inBytes As Any, ByVal input_size As Long, outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As Long 
Private Const OFFSET As Long = &H8 
'解压缩数组 
Public Function UnCompressByte(ByteArray() As Byte) As Boolean 
  
  Dim BufferSize  As Long 
  Dim buffer()    As Byte 
  Dim lReturn    As Long 
  
  Dim outUsed    As Long 
  Dim inUsed      As Long 
  
  '创建解压缩后的缓存 
  CopyMemory BufferSize, ByteArray(0), OFFSET 
  BufferSize = BufferSize + (BufferSize * 0.01) + 12 
  ReDim buffer(BufferSize) As Byte 
  
  '创建解压缩进程 
  Dim contextHandle As Long: InitDecompression 
  CreateDecompression contextHandle, 1  '创建 
  
  '解压缩数据 
  lReturn = Decompress(ByVal contextHandle, ByteArray(0), UBound(ByteArray) + 1, buffer(0), BufferSize, inUsed, outUsed) 
  
  DestroyDecompression contextHandle 
  
  '删除重复的数据 
  ReDim Preserve ByteArray(0 To outUsed - 1) 
  CopyMemory ByteArray(0), buffer(0), outUsed 
  
End Function 
 
 
#include
#includeint main()
{
 
 HINSTANCE hGetProcIDDLL = LoadLibrary("C://WINNT//system32//gzip.dll");
 printf("dll loaded");
   /* get pointer to the function in the dll*/
   FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"Decompress"); 
   FARPROC lpfnGetProcessID1 = GetProcAddress(HMODULE (hGetProcIDDLL),"InitDecompression"); 
   FARPROC lpfnGetProcessID2 = GetProcAddress(HMODULE (hGetProcIDDLL),"CreateDecompression");
   FARPROC lpfnGetProcessID3 = GetProcAddress(HMODULE (hGetProcIDDLL),"InitCompression");
   FARPROC lpfnGetProcessID4 = GetProcAddress(HMODULE (hGetProcIDDLL),"CopyMemory");
    
   
   // Call CopyMemory(arrDestination(destbeginPos), arrSource(srcbeginPos), length)
 
// printf("Hello World long decompress!/n");
 //printf(1);
 
  typedef long (__stdcall * pICFUNC)(long, BYTE[],long,BYTE[],long,long,long);
  typedef long (__stdcall * pICFUNC1)();
  typedef long (__stdcall * pICFUNC2)(long,int);
  typedef long (__stdcall * pICFUNC3)();
  typedef long (__stdcall * pICFUNC4)(BYTE[],BYTE[],long);
 
   typedef UINT (CALLBACK* CopyMemory)(BYTE[],BYTE[],long);
   CopyMemory ptrCopyMemory;
   ptrCopyMemory = (CopyMemory)GetProcAddress(hGetProcIDDLL,"CopyMemory");
    typedef UINT (CALLBACK* InitDecompression)();   InitDecompression ptrInitDecompression;
   ptrInitDecompression = (InitDecompression)GetProcAddress(hGetProcIDDLL,"InitDecompression");
    //ReturnVal = ptrLockWorkStation();
   ptrInitDecompression();
   printf("Hello World long decompress!/n");
 
 
   pICFUNC MyFunction;
   MyFunction = pICFUNC(lpfnGetProcessID);
   pICFUNC1 MyFunction1;
   MyFunction1 = pICFUNC1(lpfnGetProcessID1);
   pICFUNC2 MyFunction2;
   MyFunction2 = pICFUNC2(lpfnGetProcessID2);
   pICFUNC3 MyFunction3;
   MyFunction3 = pICFUNC3(lpfnGetProcessID3);
   pICFUNC4 MyFunction4;
   MyFunction4 = pICFUNC4(lpfnGetProcessID4);
   
   
   //BYTE[] a=NewByteArray(jb);
 
 unsigned long handle=0;long max=1024;long inu=0;long outu=0;int GZIP_LVL=1;
  
   
 BYTE *AB={(unsigned char *)"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"};
// int li= strlen( (char*)AB);
 int orglen=100;
 
//printf("%l", li);
 
 BYTE *oB=new BYTE[43822];
  CopyMemory(AB,oB,234);   
 printf("function defined and parameters ready"+orglen,"%l",orglen);
 printf("function defined and parameters ready");
   /* The actual call to the function contained in the dll */
  
   handle=MyFunction1(); 
   //handle=MyFunction4(AB,oB,inu);
   handle=MyFunction3(); 
   printf("InitDecompression & InitCompression");
   MyFunction2(handle,GZIP_LVL);//Call CreateDecompression(handle, GZIP_LVL);
   //handle=MyFunction2(handle,GZIP_LVL);
   printf("CreateDecompression");
 
  long intMyReturnVal =0;
  do
  {// int
    
    intMyReturnVal=MyFunction(handle, AB, orglen, oB, max, inu, outu);
    orglen = orglen - inu;
  }
  while(intMyReturnVal=0);
 
   /* Release the Dll */
   FreeLibrary(hGetProcIDDLL);
 printf("Hello World long decompress!/n");
   /* The return val from the dll */
    return intMyReturnVal;  
}
[HR][/HR]
  Public Function UnCompress(ByVal srcGzip As String, ByVal distFile As String) As Boolean
        Dim success As Boolean = True
        Dim read, out As FileStream, gzStream As GZipStream
        Try
            read = New FileStream(srcGzip, FileMode.Open)
            gzStream = New GZipStream(read, CompressionMode.Decompress)
            If (File.Exists(distFile)) Then
                File.Delete(distFile)
            End If
            out = New FileStream(distFile, FileMode.Create)
            Dim len As Int32 = 1024 * 1024
            Dim buffer(len) As Byte
            Dim count As Int32 = 0
            While (True)
                count = gzStream.Read(buffer, 0, len)
                If (count = 0) Then
                    Exit While
                End If
                out.Write(buffer, 0, count)
            End While
        Catch ex As Exception
            MsgBox(ex.Message)
            success = False
        Finally
            If Not (read Is Nothing) Then
                read.Close()
            End If
            If Not (out Is Nothing) Then
                out.Close()
            End If
        End Try
        Return success
    End Function 
                        
登录后可发表评论
点击登录