RpcServerRegisterIfEx 函数 (rpcdce.h)

RpcServerRegisterIfEx 函数向 RPC 运行时库注册接口。

语法

RPC_STATUS RpcServerRegisterIfEx(
  RPC_IF_HANDLE      IfSpec,
  UUID               *MgrTypeUuid,
  RPC_MGR_EPV        *MgrEpv,
  unsigned int       Flags,
  unsigned int       MaxCalls,
  RPC_IF_CALLBACK_FN *IfCallback
);

参数

IfSpec

指示要注册的接口的 MIDL 生成的结构。

MgrTypeUuid

指向要与 MgrEpv 参数关联的 UUID 类型的指针。 指定 null 参数值 (或 nil UUID) 会将 IfSpec 注册到 nil 类型 UUID。

MgrEpv

管理器例程的入口点矢量 (EPV) 。 若要使用 MIDL 生成的默认 EPV,请指定 null 值。 有关详细信息,请参阅 RPC_MGR_EPV

Flags

标志。 有关标志值的列表,请参阅 接口注册标志

MaxCalls

服务器可以在自动侦听接口上接受的最大并发远程过程调用请求数。 MaxCalls 参数仅适用于自动侦听接口,在非自动侦听接口上将被忽略。 RPC 运行时库会尽最大努力确保服务器允许的并发调用请求数不会超过 MaxCalls 中指定的调用数。 实际数字可能更大,并且可能会因每个协议序列而异。

对其他接口的调用由 RpcServerListen 函数调用中指定的进程范围 MaxCalls 参数的值控制。

如果并发调用数不是问题,则通过使用RPC_C_LISTEN_MAX_CALLS_DEFAULT指定默认值,可以实现稍微更好的服务器端性能。 这样做可以缓解 RPC 运行时环境强制实施不必要的限制。

IfCallback

安全回调函数,或 NULL 表示无回调。 每个已注册的接口可以具有不同的回调函数。 有关更多详细信息,请参阅备注。

返回值

成功后返回RPC_S_OK。

注意 有关有效错误代码的列表,请参阅 RPC 返回值
 

注解

RpcServerRegisterIfEx 的参数和效果包括 RpcServerRegisterIf 的参数和效果。 区别在于能够注册自动侦听接口并指定安全回调函数。

服务器应用程序代码调用 RpcServerRegisterIfEx 来注册接口。 为了注册接口,服务器提供以下信息:

  • 接口规范

    接口规范是 MIDL 编译器生成的数据结构。

  • 管理器类型 UUID 和管理器 EPV

    管理器类型 UUID 和管理器 EPV 确定服务器从客户端接收远程过程调用请求时执行哪个管理器例程。 对于服务器提供的接口的每个实现,它必须注册一个单独的管理器 EPV。

    请注意,指定非 nil 管理器类型 UUID 时,服务器还必须调用 RpcObjectSetType 来注册此非 nil 类型的对象。

指定RPC_IF_AUTOLISTEN标志会将接口标记为自动侦听接口。 注册接口后,运行时将立即开始侦听调用,并在注销接口时停止侦听。 为此接口调用 RpcServerUnregisterIf 将等待此接口上所有挂起的调用完成。 对 RpcServerListenRpcMgmtStopServerListening 的调用不会影响接口,也不会影响对 IfSpec == NULLRpcServerUnregisterIf 的调用。 这允许 DLL 注册 RPC 接口或将其从注册表中删除,而无需更改main应用程序的 RPC 状态。

通过指定安全回调函数,服务器应用程序可以按客户端限制对其接口的访问。 请记住,默认情况下,安全性是可选的;服务器运行时将调度不安全的调用,即使服务器已调用 RpcServerRegisterAuthInfo。 如果服务器希望仅接受经过身份验证的客户端,接口回调函数必须调用 RpcBindingInqAuthClientRpcGetAuthorizationContextForClient 函数来检索安全级别,或者尝试使用 RpcImpersonateClient 模拟客户端。 它还可以在接口标志中指定RPC_IF_ALLOW_SECURE_ONLY标志。

当服务器应用程序为其接口指定安全回调函数 () 时,RPC 运行时会自动拒绝对该接口的未经身份验证的调用。 此外,运行时还会记录每个客户端已使用的接口。 当客户端向在当前通信会话期间未使用的接口发出 RPC 时,RPC 运行时库将调用接口的安全回调函数。 指定RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH标志将阻止自动拒绝未经身份验证的客户端。

有关回调函数的签名,请参阅 RPC_IF_CALLBACK_FN

如果允许客户端在此接口中调用方法,则回调函数应返回RPC_S_OK。 任何其他返回代码都会导致客户端收到异常RPC_S_ACCESS_DENIED。

在某些情况下,RPC 运行时可能会为每个客户端-每个接口多次调用安全回调函数。 请确保回调函数可以处理这种可能性。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 rpcdce.h (包括 Rpc.h)
Library Rpcrt4.lib
DLL Rpcrt4.dll

另请参阅

注册接口

RpcBindingFromStringBinding

RpcBindingSetObject

RpcGetAuthorizationContextForClient

RpcNsBindingExport

RpcNsBindingImportBegin

RpcNsBindingLookupBegin

RpcObjectSetType

RpcServerRegisterIf

RpcServerRegisterIf2

RpcServerRegisterIf3

RpcServerUnregisterIf

RpcServerUnregisterIfEx