RpcSsContextLockExclusive 函式 (rpcasync.h)
RpcSsContextLockExclusive 函式可讓應用程式在獨佔模式中使用內容句柄。 RpcSsContextLockExclusive 函式可讓在 IDL 或 ACF 檔案中宣告為非串行化 (共用) 的方法動態變更,以在串行化 (獨佔) 模式中存取內容句柄。
語法
RPC_STATUS RpcSsContextLockExclusive(
[in] RPC_BINDING_HANDLE ServerBindingHandle,
[in] PVOID UserContext
);
參數
[in] ServerBindingHandle
伺服器上的系結句柄,代表對客戶端的系結。 伺服器會模擬此句柄所指示的用戶端。 如果指定零的值,伺服器就會模擬此伺服器線程所服務的用戶端。
[in] UserContext
由 RPC 傳遞至管理員或伺服器例程的指標。 請參閱<備註>。
若為僅限輸出的內容句柄, RpcSsContextLockExclusive 函式 不會執行任何作業。
傳回值
在成功執行時傳回RPC_S_OK,表示線程現在可存取獨佔模式的內容句柄。 當多個線程嘗試對內容句柄進行獨佔鎖定時,傳回ERROR_MORE_WRITES。 請參閱<備註>。
備註
修改內容句柄是串行化還是非串行化對應用程式很有用,以判斷是否根據執行時偵測到的條件關閉內容句柄。 若要將內容句柄從串行化 (獨佔) 變更為非串行化 (共用) ,請使用 RpcSsContextLockShared 函式。
針對 UserContext 參數,如果管理員例程收到內容句柄的指標,它就必須將 RpcSsContextLockExclusive 函式傳遞給它從 RPC 接收的相同指標。 如果管理員例程收到內容句柄本身,這通常僅適用於 [in] 內容句柄,它必須將內容句柄本身傳遞至 RpcSsContextLockExclusive 函式 。 下列程式代碼範例將示範下列專案:
void _UseShared(
/* [in] */ handle_t Binding,
//...
/* [in] */ TestContextHandleShared *Ctx,
//...
)
{
//...
RpcStatus = RpcSsContextLockExclusive(Binding, Ctx);
//...
}
如果管理員例程採用多個 [in, out] 內容句柄做為自變數,RPC 會將內容句柄的指標提供給管理員例程,而不是內容句柄本身。 指標保證是唯一的,因此將指標傳遞至 RpcSsContextLockExclusive 函式是明確的。 不過,如果函式只接受多個 [in] 內容句柄,RPC 會提供管理員例程內容句柄本身。 因此,內容句柄可能不是唯一的。 在此情況下,RPC 會在具有指定值的第一個內容句柄上執行此函式。
在共用模式中時,方法不應該修改內容句柄。 呼叫 RpcSsContextLockExclusive 函式並不會排除指定內容句柄上的讀取器鎖定;這可確保未在共用模式中修改內容句柄之應用程式的未變更內容句柄。 如果兩個線程同時呼叫 RpcSsContextLockExclusive 函式,嘗試取得相同內容句柄的獨佔鎖定,則會傳回一個任意選擇的線程RPC_S_OK,另一個則會傳回ERROR_MORE_WRITES。 傳回ERROR_MORE_WRITES線程會收到獨佔鎖定,但其內容句柄上的讀取器鎖定會在傳回時遺失。 接收ERROR_MORE_WRITES的呼叫端在 RpcSsContextLockExclusive 函式傳回時,必須假設內容句柄沒有任何內容,因為可能已經終結。
異步呼叫一次不得在多個線程的相同呼叫物件上使用 RpcSsContextLockExclusive 函式。
RpcSsContextLockExclusive 函式可能會因為記憶體不足而失敗,因此 RPC 伺服器必須準備好處理這類錯誤。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | rpcasync.h (包含 Rpc.h) |
程式庫 | Rpcrt4.lib |
Dll | Rpcrt4.dll |