我使用Microsoft RPC进行进程间通信。我有一个接口,其中包含一组接受字节管道作为“in”参数的方法(IDL描述):
[
uuid(ActualGuidHere),
version(1.0),
pointer_default(unique)
]
interface IMyInterface
{
//other irrelevant methods here
error_status_t rpcDoAction( [in] pipe byte params );
//more irrelevant methods here
}
每当我在客户端通过MIDL生成的客户端存根调用此类方法并委托给NdrClientCall2()时,它不会到达服务器端,但是NdrClientCall2()返回RPC_S_ALREADY_LISTENING(“服务器”已经在听了“),这真的令人困惑。
我在传输期间添加了用于推/拉操作的函数的记录 - 它们不会被调用任何以这种方式失败的调用。这意味着甚至没有开始传输。
在调用没有管道作为参数的方法时,我从未遇到过这种行为。
可能是什么原因和解决方法?
答案 0 :(得分:1)
文档似乎很少 - 我认为直接使用RPC API没有庞大的用户社区 - 但我的猜测是,为了设置管道参数,它RPC在内部调用RpcServerListen
是必要的。只有一次调用该API才能一次阻止。
您偶尔会看到问题的事实表明它与时间有关,您是否有可能在不同的线程上进行两次此类调用,有时它们会同时发生?
要么在RPC库的实现中存在与时序相关的错误,您必须通过重试调用来解决它(在任何情况下这可能是一种有效的解决方法)。
答案 1 :(得分:0)
我认为这不应该被视为一个问题。见PRB: CoCreateInstance Fails in RPC Server
也可以查看此内容:How To Register Multiple RPC Server Interfaces
[UPDATE]
也许在内存释放方面存在问题。查看PIPE的实施示例并检查您的代码
Implementing Input Pipes on the Client
Implementing Output Pipes on the Client
Implementing Input Pipes on the Server
Implementing Output Pipes on the Server