谁能提供 VB6 引用“gzip.dll” 编写的压缩代码,网上只有解压的代码。 谢谢

zfss12006 2017-05-13 03:20:23
网上都是介绍解压缩的代码。 我要压缩的代码。
使用下面代码运行到红色字体报错:ByteArray 类型不匹配。

谁能提供 GZip 关于 compress 函数的详细参数说明,谢谢


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function InitCompression Lib "gzip.dll" () As Long
Private Declare Function CreateCompression Lib "gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
Private Declare Function DestroyCompression Lib "gzip.dll" (ByRef context As Long) As Long
Private Declare Function Compress Lib "gzip.dll" (ByVal context As Long, ByVal inBytes As Any, ByVal input_size As Long, ByVal outBytes As Long, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
Private Const GZIP_LVL As Integer = 1


Public Function GZipCompress(ByteArray() As Byte) As Boolean
Dim hContext As Long '正文句柄
Dim output_used As Long '压缩后尺寸
Dim input_used As Long '未压缩尺寸
Dim buffer() As Byte

context = 0
output_used = 0
input_used = 0

InitCompression ' // 初始化压缩
CreateCompression hContext, GZIP_LVL

ReDim buffer(UBound(In_bytes))

If (Compress(hContext, ByteArray, UBound(ByteArray), buffer, UBound(buttfer), input_used, output_used, GZIP_LVL) <> 0) Then
GZipCompress=false
exit function
End If
GZipCompress=true

end function
...全文
571 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-05-16
  • 打赏
  • 举报
回复
算不上什么“思路”,我用过“Zlib.dll”的压缩、解压接口, 有一定的参考意义,因此这个“参数”要怎么传,可以进行类比推测。 我把 Compress( ) 最后一个参数去掉(少声明一个参数),显示“调用约定错误”,   这说明“函数形式”、参数个数(8个参数),在“大方向”上已经是正确的了。 然而开始的调用,它的“错误返回”,我查了一下,是“参数错误”。 对“第1个”,没啥可怀疑的,应该是它; 第2个,也总感觉它应该是”输入“用的; 然后把“第3个、第4个”交换,调用时也是同一个错误。 仔细想来,已经没啥可怀疑的了,唯有试一下“输出缓冲区大小”,会不会是“空间不够用”呢? 我的那段测试代码,把输出缓冲区增加到512字节再试,成功了………… 反复运行几次,发现那200字节的随机数据,压缩输出始终要占用400多字节的空间。 开始的320字节,当然一直是“不够用”。 微软的程序猿也是,脑壳是不是进水太多了…… 空间不足,偏偏弄个“参数错误”的错误代码来返回! 以前用的ZLib的,同样的问题就有一个明确的错误代码:Z_BUF_ERROR。 看看“别人的”函数库,如果出错,原因直观得多!
赵4老师 2017-05-15
  • 打赏
  • 举报
回复
如果是我:
Shell "c:\progra~1\winrar\rar a -r d:\mydir\myrar.rar d:\mydata\*.*",vbHide
zfss12006 2017-05-15
  • 打赏
  • 举报
回复
@cheng8013 确实是输出缓冲区设置太小了, 我在未压缩长度上再增加512 就OK了。 谢谢!! 另外,想知道你什么怎么怀疑到缓冲区大小上的? 很想知道你的解题思路
zfss12006 2017-05-14
  • 打赏
  • 举报
回复
gzip.dll 是Windows 自带的, 你可要在C: 搜索一下。我手头也没有该函数的资料。 Compress()函数按你指出的错误修改 确实是不再报错,但是没有压缩,字节数不变。
舉杯邀明月 2017-05-14
  • 打赏
  • 举报
回复
找到原因了。 原来是给的“输出缓冲区”太小了。 原来那“200字节”随机数经“压缩”后,需要的空间是400到410字节左右。 (压缩后,占用的数据空间增加了200字节左右…………) 我给的512字节的缓冲区,执行就正确了。 (反正即使产生200字节的字母编码,“输出”的数据也是“乱码”了)
舉杯邀明月 2017-05-14
  • 打赏
  • 举报
回复
引用 5 楼 zfss12006 的回复:
gzip.dll 是Windows 自带的, 你可要在C: 搜索一下。我手头也没有该函数的资料。

Compress()函数按你指出的错误修改 确实是不再报错,但是没有压缩,字节数不变。

Windows哪有“自带”gzip.dll…………  
你看看下图,要是系统自带,就不会弹出“文件找不到”的错误了。


网上说的是要安装了“IIS服务组件”的才有,我在网上下载了一个。
测试发现,那个“Compress( )”的调用始终不正常,返回的代码,查了一下是“参数错误”。
不过,我还真想不明白是错在哪点了。

还有,DestroyCompression( )的参数声明,你的也是错误的。
正确的是ByVal,而不是ByRef 。
我之前看你的这个代码,就感觉不应该是ByRef 。
按ByRef进行调用,DestroyCompression( )返回非0值(一个错误代码),然后还会引起IDE直接崩溃。
我用ByVal调用,返回值为0 ,然后IDE也完全没有异常出现。
舉杯邀明月 2017-05-14
  • 打赏
  • 举报
回复
Compress( ) 这个函数的参数, 按你贴出来的“原型”,和API函数的“一般规律”,这个API应该是象我在1楼中所说的那样声明和使用的。
舉杯邀明月 2017-05-14
  • 打赏
  • 举报
回复
百度了一下,找不到有“真正价值”的东西。 好多都在说用Zlib实现gzip的压缩。 你的dll是从哪下载的? 有没有这个dll的函数原型的资料?
zfss12006 2017-05-13
  • 打赏
  • 举报
回复
按 @cheng8013 的要求改写API声明:
Private Declare Function InitCompression Lib "gzip.dll" () As Long
Private Declare Function CreateCompression Lib "gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
Private Declare Function DestroyCompression Lib "gzip.dll" (ByRef context As Long) As Long
Private Declare Function Compress Lib "gzip.dll" (ByVal context As Long, ByRef inBytes As Any, ByVal input_size As Long, ByRef outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
Private Const GZIP_LVL As Integer = 1


Public Function GZipCompress(ByteArray() As Byte) As Boolean
    Dim hContext As Long                '正文句柄
    Dim output_used As Long             '压缩后尺寸
    Dim input_used As Long              '未压缩尺寸
    Dim buffer() As Byte
    Dim iReturn As long
   
    context = 0
    output_used = 0
    input_used = 0
    
    InitCompression                     ' // 初始化压缩
    CreateCompression hContext, GZIP_LVL
    ReDim buffer(UBound(ByteArray) + 255)

   lReturn = Compress(ByVal hContext, ByteArray(0), UBound(ByteArray) + 1, buffer(0), UBound(buffer), input_used, output_used, GZIP_LVL)

End Function
已经不报错了,但是数据没有被压缩。 IReturn 值是 -2147024809 我怀疑还是 Compress 函数中的参数没写好。
舉杯邀明月 2017-05-13
  • 打赏
  • 举报
回复 1
Function Compress( ) 的API声明形式不正确。 第2个、第4个参数,应该用“ByRef xxxx As Any”,或者用“ByVal xxxx As Long”。 然后在调用时,如果是ByRef的参数,就用 ByteArray(0)和buffer(0);   如果是ByVal As long的参数,就要用 VarPtr(ByteArray(0))和VarPtr(buffer(0))。 另外,必须注意的是:在调用 Compress( )之前,你的buffer()必须先用redim 给它分配足够大的数据空间!   否则会造成你的进程崩溃。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧