ILockBytes::LockRegion 方法 (objidl.h)

LockRegion 方法會限制對位元組陣列中指定位元組範圍的存取。

語法

HRESULT LockRegion(
  [in] ULARGE_INTEGER libOffset,
  [in] ULARGE_INTEGER cb,
  [in] DWORD          dwLockType
);

參數

[in] libOffset

指定範圍開頭的位元組位移。

[in] cb

以位元組為單位,指定要限制的範圍長度。

[in] dwLockType

指定存取範圍時所要求的限制類型。 此參數使用 LOCKTYPE 列舉的其中一個值。

傳回值

這個方法可以傳回下列其中一個值。

傳回碼 描述
S_OK 指定的位元組範圍已鎖定。
STG_E_INVALIDFUNCTION 完全不支援鎖定,或不支援所要求的特定鎖定類型。
STG_E_ACCESSDENIED 因為呼叫端的許可權不足,或另一個呼叫端開啟並鎖定檔案,所以拒絕存取。
STG_E_LOCKVIOLATION 因為另一個呼叫端已開啟並鎖定檔案,所以拒絕存取。
STG_E_INVALIDHANDLE 基礎檔案已提前關閉,或正確的磁碟片已被無效的磁碟取代。

備註

ILockBytes::LockRegion 會限制對指定位元組範圍的存取。 鎖定區域之後,其他人嘗試取得限制範圍的存取權必須失敗,並出現STG_E_ACCESSDENIED錯誤。

位元組範圍可以延伸超過位元組陣組的目前結尾。 超出陣列結尾的鎖定,有助於做為位元組陣組物件不同實例之間通訊的方法,而不需要變更實際屬於位元組陣列的數據。 例如,複合檔案的 ILockBytes 實作可能依賴鎖定超過數位目前結尾的鎖定作為訪問控制的方法,使用特定的鎖定區域來指出目前授與的許可權。

dwLockType 參數會使用LOCKTYPE列舉中的值,指定三種鎖定類型的其中一種。 這些類型如下所示:鎖定以排除其他寫入器、鎖定以排除其他讀取器或寫入器,以及只允許一個要求者取得指定範圍鎖定的鎖定。 第三種類型的鎖定通常是其他兩種鎖定類型之一的別名,並允許實作者新增其他行為。 指定的位元組陣列可能支援前兩個類型之一,或兩者皆支援。

若要判斷特定 ILockBytes 實作所支援的鎖定類型,您可以檢查呼叫 ILockBytes::Stat 所傳回之 STATSTG 結構的 grfLocksSupported 成員。

使用 ILockBytes::LockRegion 鎖定的任何區域之後,都必須呼叫與 libOffsetcbdwLockType 參數完全相同的 ILockBytes::UnlockRegion 來明確解除鎖定。 必須先解除鎖定區域,才能釋放數據流。 無法個別鎖定兩個相鄰區域,然後使用單一解除鎖定呼叫解除鎖定。

來電者附註

由於支持的鎖定類型是選擇性的,而且在 ILockBytes 的不同實作中可能會有所不同,因此您必須提供程式碼來處理STG_E_INVALIDFUNCTION錯誤。

實作者的注意事項

此方法的支持取決於使用 ILockBytes 實作之上建置的儲存物件方式。 如果您知道在任何指定時間只能開啟一個儲存物件,且該儲存裝置在位元組陣列之下,則 您的ILockBytes 實作不需要支持鎖定。 不過,如果可以同時開啟記憶體物件,則需要區域鎖定來協調它們。

LockRegion 實作可以選擇支援所有、部分或無鎖定類型。 對於不支持的鎖定類型,實作應該會傳回STG_E_INVALIDFUNCTION。

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows 2000 Server [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 objidl.h
程式庫 Uuid.lib
Dll Ole32.dll

另請參閱

ILockBytes - File-Based 實作

ILockBytes - 全域記憶體實作

ILockBytes::Stat

ILockBytes::UnlockRegion

IStream::LockRegion

LOCKTYPE