当我们的开发人员试图调试C /Winrt NCALRPC RPC服务器后即使将断点启用到完全相同的代码,代码也是如此;它在IDE内部产生意外的符号错误消息。
我是由团队成员告知这是由于使用核心服务的其他应用程序和服务的RPC连接到RPC端点而发生的。我对RPC不了解很多,但一直在阅读。检查核心服务的来源似乎表明他们正在正确执行所有停止服务器的操作,
RPC_STATUS rs = 0;
rs = RpcMgmtStopServerListening(NULL);
//...
rs = RpcServerUnregisterIf(RPC_IF_SPEC, nullptr, 0);
//...
rs = RpcEpUnregister(RPC_IF_SPEC, BindingVector, nullptr);
但老实说,也可能是他们应该使用rs = RpcServerUnregisterIf(NULL, NULL, 0);
,我真的不能说。
现在,我们要么必须手动跟踪连接到此服务的所有过程,杀死/停止它们,要么在安装新服务后乘坐"简单"出路并执行重新启动,使我们可以在正确的情况下进行调试将过程附加到VS2017时的文件位置。
我的实用性想法是要查看我是否可以生成连接到RPC端点的流程列表,核武器,安装新服务,然后重新启动。
另外,本文似乎表明,首先避免了这个问题,可以通过称为"关联",但在某种程度上含糊不清。
关联本身是参考计数,当所有参考都消失时,它会停止并关闭所有连接。每个绑定的手柄和每个上下文手柄都有有关关联的参考。当一切关闭时,关联就会消失。
更新:
接受的答案表明,在外部过程中这是不可能的。这不是用外部过程实现此目标的一种方法。
rpc具有RPCServerInqCallAttributes功能,RPC服务器可以在客户端调用期间使用该功能,以获取客户端的安全上下文属性和其他信息。
您必须通过Windows Vista和更高的Windows版本(或Windows 8及更高版本的RPC_CALL_ATTRIBUTES_V3使用RPC_CALL_ATTRIBUTES_V2(或RPC_CALL_ATTRIBUTES_V3),因此,类似这样的东西:
// the code depends on the minimal platform you compile for
RPC_CALL_ATTRIBUTES atts = { 0 }; // should map to RPC_CALL_ATTRIBUTES_V2 or RPC_CALL_ATTRIBUTES_V3
atts.Version = RPC_CALL_ATTRIBUTES_VERSION; // should be 2 or 3
atts.Flags = RPC_QUERY_CLIENT_PID;
RpcServerInqCallAttributes(0, &atts);
... pid is in atts.ClientPID ...
这只能从RPC服务器本身调用,因此您必须以某种方式记录所有客户端PID并在服务器中添加一些API才能列出它们。