Поделиться через


Функция 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 , поврежден, функция может завершиться ошибкой, а ошибка из GetLastError может быть ERROR_BAD_COMPRESSION_BUFFER. Также возможно, что функция создаст блок несжатых данных, который не соответствует исходным данным.

Рекомендуется, чтобы в компрессорах и декомпрессорах не использовался флаг COMPRESS_RAW . Если компрессор создается с флагом COMPRESS_RAW , распаковка также должна быть создана с флагом COMPRESS_RAW .

Если компрессор и декомпрессор создаются с помощью флага COMPRESS_RAW , значение UncompressedBufferSize должно быть точно равно исходному размеру несжатых данных, а не только размеру выходного буфера. Это означает, что при использовании флага COMPRESS_RAW следует сохранить точный исходный размер несжатых данных, а также сжатые данные и сжатый размер. Если uncompressedBufferSize не равен исходному размеру несжатых данных, несжатые данные не будут совпадать с исходными данными. В этом случае функция может возвращать успешное выполнение или ERROR_BAD_COMPRESSION_BUFFER.

Если флаг COMPRESS_RAW не используется, uncompressedBufferSize не обязательно должен быть точно равен исходному размеру несжатых данных. В этом случае UncompressedDataSize возвращает исходный размер несжатых данных. Если размер UncompressedBufferSize меньше исходного размера данных, функция завершится ошибкой и присвоить uncompressedDataSize размеру исходных данных, а ошибка getLastErrorERROR_INSUFFICIENT_BUFFER.

Чтобы определить размер UncompressedBuffer , вызовите функцию с параметром UncompressedBufferSize , равным нулю. В этом случае функция завершится сбоем и присвоит uncompressedDataSize размер исходных данных, а ошибка из GetLastErrorбудет ERROR_INSUFFICIENT_BUFFER. Обратите внимание, что исходный размер, возвращаемый функцией, извлекается из самого буфера и должен рассматриваться как ненадежный и проверяться с разумными ограничениями.

Если функция вызывается с параметром CompressedDataSize , равным нулю, функция завершается сбоем и ошибка из GetLastErrorERROR_INSUFFICIENT_BUFFER. При сбое функция возвращает значение UncompressedDataSize , которое можно использовать, чтобы избежать выделения слишком большого буфера для сжатых данных. Чтобы использовать этот метод, необходимо знать максимальный размер исходных данных.

Если для параметра CompressedDataSize задано значение 0, а для параметра UncompressedBufferSize задан максимальный возможный размер исходных несжатых данных, функция Распаковка завершится сбоем, как описано выше, и для параметра UncompressedDataSize будет установлен максимальный размер буфера сжатых данных.

Если алгоритм сжатия по какой-либо внутренней причине завершается сбоем, можно ERROR_FUNCTION_FAILED ошибку getLastError. Если системе не удается найти дескриптор алгоритма сжатия, ошибка может быть ERROR_INVALID_HANDLE. Если выходной буфер слишком мал для хранения несжатых данных, ошибка может быть ERROR_INSUFFICIENT_BUFFER.

Требования

   
Минимальная версия клиента Windows 8 [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2012 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header compressapi.h
Библиотека Cab.lib
DLL Cabinet.dll

См. также раздел

Функции API сжатия