近日,由于项目的需要我初次接触了RPC,在学习过程中遇到了一些问题,在网上搜与之相关的知识时,发现有不少人都遇到过这些问题,所以当我把这些问题解决后就想将自己的解决方法写下来,供网友们参考,由于初次接触RPC,有不妥之处欢迎批评指正。
问题一: 在作控制台RPC应用程序时,常常出现“fatal error C1189: #error : You need a Windows 2000 or later to run this stub because it uses these features:”的错误信息。
该问题的解决办法如下:
在sever和client的cpp文件的顶部增加如下语句:
#ifndef _WIN32_WINNT // 允许使用特定于Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于Windows 的其他版本。
#endif
问题二:采用tcp/ip方式时 RPC程序返回RPC_S_ACCESS_DENIED 异常,如:
// 使用与端点相结合的协议接收远过程调用
if(RpcServerUseProtseqEp(
reinterpret_cast <unsigned char*> ("ncacn_np"), // 使用named pipe.
RPC_C_PROTSEQ_MAX_REQS_DEFAULT, // 积压对列长度.
reinterpret_cast <unsigned char*> ("//pipe//hello"), //named pipe端口.
NULL)) // 无安全防护.
{
return (1);
}
以上代码是可行的, 但换成如下方式时就会返回RPC_S_ACCESS_DENIED
status = RpcStringBindingCompose(
NULL, // UUID to bind to.
reinterpret_cast <unsigned char*> ("ncacn_ip_tcp"), // 使用TCP/IP
// protocol.
reinterpret_cast <unsigned char*> ("localhost"), // TCP/IP network
// address to use.
reinterpret_cast <unsigned char*> ("4747"), // TCP/IP port to use.
NULL, // Protocol dependent network options to use.
&szStringBinding); // String binding output.
该问题的解决办法:将sever端的
// 注册RpcImplicit接口.
if(RpcServerRegisterIf(
RpcImplicit_v1_0_s_ifspec, // 用于注册的接口.
NULL, // 使用MIDL 产生入口点向量.
NULL)) //使用MIDL 产生入口点向量.
{
return (1);
}
改为:
// 注册RpcImplicit接口.
if(RpcServerRegisterIfEx(
RpcImplicit_v1_0_s_ifspec, // Interface to register.
NULL,
NULL, // Use the MIDL generated entry-point vector.
RPC_IF_ALLOW_CALLBACKS_WITH_NO_AUTH,
0,
NULL)) //使用MIDL 产生入口点向量.
{
return (1);
}