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) |
Library | Rpcrt4.lib |
DLL | Rpcrt4.dll |