Decompress 函数 (compressapi.h)

获取压缩信息块并将其解压缩。

语法

BOOL Decompress(
  [in]  DECOMPRESSOR_HANDLE DecompressorHandle,
  [in]  LPCVOID             CompressedData,
  [in]  SIZE_T              CompressedDataSize,
  [out] PVOID               UncompressedBuffer,
  [in]  SIZE_T              UncompressedBufferSize,
  [out] PSIZE_T             UncompressedDataSize
);

参数

[in] DecompressorHandle

CreateDecompressor 返回的解压缩器的句柄。

[in] CompressedData

包含要解压缩的信息块。 压缩块的大小(以字节为单位)由 CompressedDataSize 提供。

[in] CompressedDataSize

压缩信息的大小(以字节为单位)。

[out] UncompressedBuffer

接收未压缩信息的缓冲区。 缓冲区的大小(以字节为单位)由 UncompressedBufferSize 提供。

[in] UncompressedBufferSize

接收未压缩信息的缓冲区的大小(以字节为单位)。

[out] UncompressedDataSize

接收的未压缩信息的实际大小(以字节为单位)。

返回值

如果该函数成功,则返回值为非零值。 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

如果 CompressedData 指向的压缩数据块已损坏,则函数可能会失败,并且可能会ERROR_BAD_COMPRESSION_BUFFER来自 GetLastError 的错误。 该函数也可能生成与原始数据不匹配的未压缩数据块。

建议压缩器和解压缩器不要使用 COMPRESS_RAW 标志。 如果使用 COMPRESS_RAW 标志创建压缩器,则还必须使用 COMPRESS_RAW 标志创建解压缩器。

如果使用 COMPRESS_RAW 标志创建压缩器和解压缩器,则 UncompressedBufferSize 的值必须完全等于未压缩数据的原始大小,而不仅仅是输出缓冲区的大小。 这意味着,使用 COMPRESS_RAW 标志时,应保存未压缩数据的确切原始大小,以及压缩数据和压缩大小。 如果 UncompressedBufferSize 不等于未压缩数据的原始大小,则未压缩的数据将与原始数据不匹配。 在这种情况下,函数可以返回成功,也可以返回 ERROR_BAD_COMPRESSION_BUFFER

如果未使用 COMPRESS_RAW 标志, 则 UncompressedBufferSize 不需要完全等于未压缩数据的原始大小。 在这种情况下, UncompressedDataSize 返回未压缩数据的原始大小。 如果 UncompressedBufferSize 小于原始数据大小,则函数将失败,并将 UncompressedDataSize 设置为原始数据的大小,ERROR_INSUFFICIENT_BUFFER来自 GetLastError的错误。

若要确定 UncompressedBuffer 需要有多大,请在 将 UncompressedBufferSize 设置为零的情况下调用 函数。 在这种情况下,函数将失败,并将 UncompressedDataSize 设置为原始数据的大小,并且 getLastError 的错误 ERROR_INSUFFICIENT_BUFFER。 请注意,函数返回的原始大小是从缓冲区本身中提取的,应将其视为不受信任,并针对合理的限制进行测试。

如果在将 CompressedDataSize 参数设置为零的情况下调用函数,则函数将失败,并且ERROR_INSUFFICIENT_BUFFER来自 GetLastError 的错误。 如果失败,函数将返回 ,并将 UncompressedDataSize 设置为一个值,你可以使用该值来避免为压缩数据分配太大的缓冲区。 必须知道原始数据的最大可能大小才能使用此方法。

如果将 CompressedDataSize 设置为零,并将 UncompressedBufferSize 设置为原始未压缩数据的最大可能大小, 则 Decompress 函数将按所述失败, UncompressedDataSize 的值将设置为压缩数据缓冲区的最大大小。

如果压缩算法由于某种内部原因而失败,则可以ERROR_FUNCTION_FAILED来自 GetLastError 的错误。 如果系统找不到压缩算法句柄,则可以 ERROR_INVALID_HANDLE错误。 如果输出缓冲区太小,无法容纳未压缩的数据,则可能会 ERROR_INSUFFICIENT_BUFFER错误。

要求

   
最低受支持的客户端 Windows 8 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2012 [桌面应用 |UWP 应用]
目标平台 Windows
标头 compressapi.h
Library Cabinet.lib
DLL Cabinet.dll

另请参阅

压缩 API 函数