RPC_INTERFACE_TEMPLATEA结构(rpcdce.h)
RPC_INTERFACE_TEMPLATE 结构定义 RPC 接口组服务器接口。
语法
typedef struct {
unsigned long Version;
RPC_IF_HANDLE IfSpec;
UUID *MgrTypeUuid;
RPC_MGR_EPV *MgrEpv;
unsigned int Flags;
unsigned int MaxCalls;
unsigned int MaxRpcSize;
RPC_IF_CALLBACK_FN *IfCallback;
UUID_VECTOR *UuidVector;
RPC_CSTR Annotation;
void *SecurityDescriptor;
} RPC_INTERFACE_TEMPLATEA, *PRPC_INTERFACE_TEMPLATEA;
成员
Version
此字段是保留的,必须设置为 0。
IfSpec
MIDL 生成的结构,用于定义要注册的接口。
MgrTypeUuid
指向要与 MgrEpv关联的 UUID 的指针。 NULL 或 nil UUID 向 nil UUID注册 ifSpec。
MgrEpv
指向包含管理器例程入口点向量(EPV)的 RPC_MGR_EPV 结构的指针。 如果 NULL,则使用 MIDL 生成的默认 EPV。
Flags
标志。 有关标志值的列表,请参阅 接口注册标志。 接口组接口始终被视为 自动侦听。
MaxCalls
服务器在此接口上可以接受的最大并发远程过程调用请求数。 RPC 运行时库尽力确保服务器不允许的并发调用请求数超过 MaxCalls中指定的调用数。 但是,实际数字可以大于 MaxCalls,并且每个协议序列可能有所不同。
对其他接口的调用由进程范围的 MaxCalls 参数的值控制,RpcServerListen中指定的参数。
如果并发调用数不相关,则通过使用 RPC_C_LISTEN_MAX_CALLS_DEFAULT指定默认值可以实现稍微更好的服务器端性能。 这样做可以缓解 RPC 运行时环境强制实施不必要的限制。
MaxRpcSize
传入数据块的最大大小(以字节为单位)。 MaxRpcSize 可用于帮助防止恶意拒绝服务攻击。 如果远程过程调用的数据块大于 MaxRpcSize,RPC 运行时库将拒绝该调用并将 RPC_S_ACCESS_DENIED 错误发送到客户端。 MaxRpcSize 中指定值 (unsigned int) –1, 删除传入数据块的大小限制。 此参数对通过 ncalrpc 协议进行的调用没有影响。
IfCallback
指向 RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN 安全回调函数的指针,或针对无回调 NULL。 每个已注册的接口可以具有不同的回调函数。
UuidVector
指向要向 RPC 终结点映射器注册的服务器提供的 对象
Annotation
指向应用于添加到本地终结点映射数据库的每个跨产品元素的字符串注释的指针。 字符串长度最多为 64 个字符,包括 null 终止字符。 如果没有批注字符串,请指定 null 值或以 null 结尾的字符串(“\0”)。
批注字符串仅供应用程序用于信息。 RPC 不使用此字符串来确定客户端与哪个服务器实例通信或枚举终结点映射数据库中的元素。
SecurityDescriptor
描述哪些客户端有权访问接口的可选安全描述符。
言论
若要注册接口,服务器提供以下信息:
- 接口规范 接口规范是 MIDL 编译器生成的数据结构。
- 管理器类型 UUID 和管理器 EPV 管理器类型 UUID,管理器 EPV 确定服务器从客户端接收远程过程调用请求时执行哪个管理器例程。 对于服务器提供的接口的每个实现,它必须注册单独的管理器 EPV。 请注意,指定非 nil 的管理器类型 UUID时,服务器还必须调用 RpcObjectSetType 来注册此非 nil 类型的对象。
所有接口组接口都被视为 自动侦听。 激活接口组后,运行时将立即开始侦听调用。 对 RpcServerListen 和 RpcMgmtStopServerListening 的调用不会影响接口,也不会调用 RpcServerUnregisterIf,IfSpec 设置为 NULL。
在 IfCallback 中指定安全回调函数可让服务器应用程序限制对各个客户端接口的访问。 默认情况下,安全性是可选的;即使服务器已调用 rpcServerRegisterAuthInfo
当服务器应用程序在 IfCallback中为其接口指定安全回调函数时,RPC 运行时会自动拒绝调用而不向该接口提供身份验证信息。 此外,运行时记录每个客户端使用的接口。 当客户端向当前通信会话期间未使用的接口发出 RPC 时,RPC 运行时库将调用接口的安全回调函数。 在 标志 中指定 RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH 将阻止自动拒绝未经身份验证的客户端。 请注意,即使调用来自匿名客户端,NULL 安全会话的调用也可以具有身份验证信息。 因此,单独存在回调不足以阻止匿名客户端连接;安全回调函数必须检查该函数,或者必须使用RPC_IF_ALLOW_SECURE_ONLY标志。 RPC_IF_ALLOW_SECURE_ONLY仅拒绝 Windows XP 和更高版本的 Windows 上的 null 会话调用。
有关回调函数的签名,请参阅 RPC_IF_CALLBACK_FN。
如果允许客户端在此接口中调用方法,IfCallback 中的回调函数应返回 RPC_S_OK。 任何其他返回代码都将导致客户端收到异常 RPC_S_ACCESS_DENIED。
在某些情况下,RPC 运行时可能会为每个客户端(每个接口)多次调用安全回调函数。 回调函数必须能够处理这种可能性。
注意
rpcdce.h 标头将RPC_INTERFACE_TEMPLATE定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 8 [仅限桌面应用] |
支持的最低服务器 | Windows Server 2012 [仅限桌面应用] |
标头 | rpcdce.h (包括 Rpc.h) |
另请参阅
RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN