rpcEpRegisterNoReplace 函数 (rpcdce.h)
RpcEpRegisterNoReplace 函数将服务器地址信息添加到本地终结点映射数据库。
语法
RPC_STATUS RpcEpRegisterNoReplace(
RPC_IF_HANDLE IfSpec,
RPC_BINDING_VECTOR *BindingVector,
UUID_VECTOR *UuidVector,
RPC_CSTR Annotation
);
参数
IfSpec
用于向本地终结点映射数据库注册的接口。
BindingVector
指向绑定句柄的向量的指针,服务器可通过该向量接收远程过程调用。
UuidVector
指向服务器提供的对象 UUID 的矢量的指针。 服务器应用程序构造此向量。
空参数值表示没有要注册的对象 UUID。
Annotation
指向应用于添加到本地终结点映射数据库的每个跨积元素的字符串注释的指针。 字符串长度最多为 64 个字符,包括 null 终止字符。 如果没有批注字符串,请指定 null 值或以 null 结尾的字符串 (“\0”) 。
注释字符串仅由应用程序用于信息。 RPC 不使用此字符串来确定客户端与哪个服务器实例通信或枚举终结点映射数据库中的元素。
返回值
值 | 含义 |
---|---|
|
调用成功。 |
|
无绑定。 |
|
绑定句柄无效。 |
|
这是操作的错误绑定类型。 |
注解
RpcEpRegisterNoReplace 函数将条目添加到本地主机的终结点映射数据库中。 此函数不替换现有数据库条目。
当服务器的多个实例将在同一主机上运行时,服务器使用 RpcEpRegisterNoReplace 而不是 RpcEpRegister 。 换句话说,当多个服务器实例随时提供相同的接口 UUID、对象 UUID 和协议序列时,请使用此函数。
由于调用 RpcEpRegisterNoReplace 时不会替换条目,因此服务器必须在停止运行之前自行注销。 否则,每次服务器实例停止运行而不调用 RpcEpUnregister 时,都会累积过时的数据。 过时条目会增加客户端接收到不存在服务器的终结点的可能性。 在获取另一个终结点之前,客户端将花时间尝试与不存在的服务器通信。
服务器可以使用 RpcEpRegister 和 RpcEpRegisterNoReplace 在终结点映射器数据库中注册条目。 在 Windows 2000 之前,有两个函数可用于使服务器能够覆盖终结点映射器数据库中的过时条目,这些条目与以前不再运行的服务器实例相比。 一旦服务器停止工作,终结点映射器数据库就会自动删除服务器实例注册的条目。 但是,出于安全目的,不允许服务器替换另一台服务器的终结点映射器条目。 因此, RpcEpRegister 和 RpcEpRegisterNoReplace 执行的功能大致相同。
服务器应用程序调用 RpcEpRegister 以注册通过调用以下任何函数指定的终结点:
- RpcServerUseAllProtseqs
- RpcServerUseProtseq
- RpcServerUseProtseqEp
- RpcServerUseAllProtseqsIf
- RpcServerUseProtseqIf
如果在未指定终结点的情况下使用协议序列,则 RPC 运行时库将自动生成动态终结点。 在这种情况下,服务器可以调用 RpcServerInqBindings ,后跟 RpcEpRegisterNoReplace ,使自身可供多个客户端使用。 否则,只有启动服务器的客户端才能知道自动启动的服务器。
在逻辑上添加到 endpoint-map 数据库的每个元素都包含以下内容:
- 接口 UUID
- 接口版本 (主要和次要)
- 绑定句柄
- 对象 UUID (可选)
- 注释 (可选)
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | rpcdce.h (包括 Rpc.h) |
Library | Rpcrt4.lib |
DLL | Rpcrt4.dll |