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 |