解壓縮函式 (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 設定為原始資料的大小,而且 GetLastError 的錯誤 ERROR_INSUFFICIENT_BUFFER

若要判斷 UncompressedBuffer 需要的大小,請呼叫 將 UncompressedBufferSize 設為零的函式。 在此情況下,函式將會失敗,並將 UncompressedDataSize 設定為原始資料的大小,且 來自 GetLastError 的錯誤 ERROR_INSUFFICIENT_BUFFER。 請注意,函式所傳回的原始大小會從緩衝區本身擷取,而且應該視為不受信任,並針對合理的限制進行測試。

如果使用 CompressedDataSize 參數設定為零呼叫函式,則函式會失敗,而且 GetLastError 的錯誤 ERROR_INSUFFICIENT_BUFFER。 當函式失敗時,函式會傳回 UncompressedDataSize 設定為值,讓您可用來避免為壓縮資料配置太大的緩衝區。 您必須知道原始資料的最大可能大小,才能使用此方法。

如果您將 CompressedDataSize 設定為零,並將 UncompressedBufferSize 設定為原始未壓縮資料的最大可能大小, Decompress 函式將會失敗,並將 UncompressedDataSize 的值設定為壓縮資料緩衝區的大小上限。

如果壓縮演算法因為某些內部原因而失敗, 則 GetLastError 的錯誤可能會 ERROR_FUNCTION_FAILED。 如果系統找不到壓縮演算法控制碼,則可以 ERROR_INVALID_HANDLE錯誤。 如果輸出緩衝區太小而無法保存未壓縮的資料,則可以 ERROR_INSUFFICIENT_BUFFER錯誤。

規格需求

   
最低支援的用戶端 Windows 8 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2012 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 compressapi.h
程式庫 Cabinet.lib
Dll Cabinet.dll

另請參閱

壓縮 API 函式