RPC的有关问题及其解决方法

来源:互联网 发布:程序员 兼职 编辑:程序博客网 时间:2024/04/30 06:50

    近日,由于项目的需要我初次接触了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);
  }

原创粉丝点击