2009-04-09 151 views
0

我有一个使用Microsoft RPC进行进程间通信的程序。当与[在,字符串]像这样(MIDL符号)参数的方法的调用:“呼叫失败并且未执行”

interface IOurInterface 
{ 
    error_status_t rpcMethod([in, string] const WCHAR* parameter); 
} 

被调用它通常是成功的。但是,如果参数字符串足够长(超过大约300万个字符),则调用失败,并且RPC_S_CALL_FAILED_DNE(“远程过程调用失败并且未执行。”)。这当然取决于字符串的长度。如果字符串在限制范围内,则在相同条件下的相同调用总是成功,如果字符串较长,则总是失败。它看起来像极限是系统或机器相关的。

有没有人观察过这种行为,以及可能的解决方案是什么(不缩短参数)?

回答

1

我以前曾观察过该消息,但我不认为它是同一个原因 - “未执行”是一个泛型的RPC错误,可能由许多事情引起。

在我们的特殊情况下,这是因为我们在捶打WMI时太难而且没有清理我们的物体。但在你的情况下,它似乎是一个不同的原因。

我知道你说你不想缩短参数,但这可能是你前进的唯一途径。我很难想象您需要在RPC调用中发送6M的情况。也许如果你解释它背后的原因,我们可以进一步提供帮助。

基于评论日期其他可能性:

1 /分割。

RPC调用是否限制通过导线传输的数据量。这可以通过在源处分割消息并在目的地重建它来完成,例如有三个参数(您可以让服务器在另一个RPC调用中释放消息标识符,或者找到其他方法确保没有两个客户端具有相同的ID): - 消息标识符(用于将消息段捆绑在一起)。 - 最后一个标志(开始重建过程)。 - 尺寸有限的细分受众群(例如1M)。

2 /压缩。

由于XML是文本,压缩已经成熟。在尺寸缩小方面,7zip库是我见过的最好的。这是否足够快是另一回事。

3/可能通过更改注册表修复。

查看RpcMaxSize密钥的HKLM/Software/Microsoft/Rpc注册表区域。有几个网站我GOOGLE了,建议将其设置为-1将删除大小限制(全球,所以要小心)。

4/可能注册您的接口时修复。

在与RpcServerRegisterIf2()的特定界面上显然可以达到与(3)相同的效果。

你可以做的就是分裂您的字符串:

+0

的原因是,我们发送超大对象的XML表示,不希望想到优化它(但它绝对有可能)。所以如果有一个简单的方法来绕过这个问题,它会非常方便。 – sharptooth 2009-04-09 12:55:50

+0

那么,分段是一种可能性:将参数限制为会话标识,最后标记和(例如)1M文本。您必须在源代码处对您的XML进行细分,并在目标位置将它们合并在一起。不是我的第一选择,而是一个应该尽最大努力工作的快速和肮脏的解决方案 – paxdiablo 2009-04-09 13:00:04

1

每个RPC调用作为一个整体的大小通常是由各种因素,如运输的限制(在UDP上,比特率/最大延迟数据包大小EX)的限制在数据包,并与多个呼叫发送,

或打开一个额外的TCP套接字将与您当前的RPC发送数据和控制它