非常简单的RPC服务程序
#include "iostream.h"
#include "stdio.h"
#include "rpc.h"
#include "windows.h"
#include "mathe.h"
#include "winsvc.h"SERVICE_STATUS servicestatus;
SERVICE_STATUS_HANDLE servicestatushandle;
void WINAPI ServiceCtrlHandler(DWORD dwControl);
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv);void _CRTAPI1 main()
{

RPC_STATUS status;
RPC_BINDING_VECTOR *pBindingVector=NULL;
UCHAR * pszProtocolSequence=(UCHAR *)"ncacn_ip_tcp";
WORD wMinCalls=1;
WORD wMaxCalls=30;
UCHAR *pszEndPoint=(UCHAR *)"8080";
    WORD fWaitFlag=FALSE;
// UCHAR * pszEntryName=(UCHAR *)
SERVICE_TABLE_ENTRY servicetableentry[] =
  {
    { "MyBigService", ServiceMain },
    { NULL, NULL }
  };
  StartServiceCtrlDispatcher(servicetableentry);
status=RpcServerUseProtseqEp(
                        pszProtocolSequence,
wMaxCalls,
pszEndPoint,
NULL);
if(status==RPC_S_OK)
{
printf("succes create !\n");

}
  //来注册接口,第一个参数是midl编译器定义的接口id.第二个参数指定使用指针类型的管理器UUID.
//他和值为null的第三个参数设置服务器,使用默认的管理器和由midl编译的代理残根所产生的入口点矢量。
    status = RpcServerRegisterIf(mathematic_v1_0_s_ifspec,  // interface to register
                                 NULL,   // MgrTypeUuid
                                 NULL);  // MgrEpv; null means use default
    printf("RpcServerRegisterIf returned 0x%x\n", status);
    if (status==RPC_S_OK) 
{
printf("register interface success\n");
    }
    status = RpcServerListen(wMinCalls,
                             wMaxCalls,
                             fWaitFlag);//最后一个参数是false表示do wait
    printf("RpcServerListen returned: 0x%x\n", status);
    if (status) {
        exit(status);
    }
    //阻止这个服务器在rpc调用到达之前退出
    if (fWaitFlag) {
        printf("Calling RpcMgmtWaitServerListen\n");
        status = RpcMgmtWaitServerListen();  // wait operation
        printf("RpcMgmtWaitServerListen returned: 0x%x\n", status);
        if (status) {
            exit(status);
        }
    }
}
/*********************************************************************/
/*                MIDL allocate and free                             */
/*********************************************************************/void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
    return(malloc(len));
}void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
    free(ptr);
}long add( 
    /* [in] */ long lNum1,
    /* [in] */ long lNum2,
    /* [retval][out] */ long *rNum)
{
*rNum=lNum1+lNum2;
return *rNum;
}
double fAdd( 
    /* [in] */ double dNum1,
    /* [in] */ long dNum2,
    /* [retval][out] */ double * dRetNum)
{
* dRetNum=dNum1+dNum2;
return *dRetNum;
}double minus( 
    /* [in] */ double minus1,
    /* [in] */ double minus2,
    /* [retval][out] */ double  *dRetMinus)
{
*dRetMinus=minus1-minus2;
    return *dRetMinus;
}double mul( 
    /* [in] */ double mul1,
    /* [in] */ double mul2,
    /* [retval][out] */ double  *dRetMul)
{
*dRetMul=mul1*mul2;
return *dRetMul;
}boolean divide( 
    /* [in] */ double div1,
    /* [in] */ double div2,
    /* [retval][out] */ double  *dRetDiv)
{
if(div2==0)
return FALSE;
else
*dRetDiv=div1/div2;
return TRUE;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR * argv)
{
  int bInitialized = 0;
  servicestatus.dwServiceType = SERVICE_WIN32;
  servicestatus.dwCurrentState = SERVICE_START_PENDING;
  servicestatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  servicestatus.dwWin32ExitCode = 0;
  servicestatus.dwServiceSpecificExitCode = 0;
  servicestatus.dwCheckPoint = 0;
  servicestatus.dwWaitHint = 0;  servicestatushandle =RegisterServiceCtrlHandler("MyBigService", ServiceCtrlHandler);
  if (servicestatushandle == (SERVICE_STATUS_HANDLE)0)
  {
    return;
  }  
  // Initialize the service
  // ...
  bInitialized = 1;  servicestatus.dwCheckPoint = 0;
  servicestatus.dwWaitHint = 0;
  if (!bInitialized)
  {
    servicestatus.dwCurrentState = SERVICE_STOPPED;
    servicestatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
    servicestatus.dwServiceSpecificExitCode = 1;
  }
  else
  {
    servicestatus.dwCurrentState = SERVICE_RUNNING;
  }
  SetServiceStatus(servicestatushandle, &servicestatus);
  return;
}
void WINAPI ServiceCtrlHandler(DWORD dwControl)
{
  switch (dwControl)
  {
    case SERVICE_CONTROL_PAUSE:
      servicestatus.dwCurrentState = SERVICE_PAUSE_PENDING;
      SetServiceStatus(servicestatushandle, &servicestatus);
      // TODO: add code to pause the service
      // not called in this service
      // ...
      servicestatus.dwCurrentState = SERVICE_PAUSED;
    break;    case SERVICE_CONTROL_CONTINUE:
      servicestatus.dwCurrentState = SERVICE_CONTINUE_PENDING;
      SetServiceStatus(servicestatushandle, &servicestatus);
      // TODO: add code to unpause the service
      // not called in this service
      // ...
      servicestatus.dwCurrentState = SERVICE_RUNNING;
    break;    case SERVICE_CONTROL_STOP:
      servicestatus.dwCurrentState = SERVICE_STOP_PENDING;
      SetServiceStatus(servicestatushandle, &servicestatus);
      // TODO: add code to stop the service
      // ...
      servicestatus.dwCurrentState = SERVICE_STOPPED;
    break;    case SERVICE_CONTROL_SHUTDOWN:
      // TODO: add code for system shutdown
      // ...
    break;    case SERVICE_CONTROL_INTERROGATE:
      // TODO: add code to set the service status
      // ...
      servicestatus.dwCurrentState = SERVICE_RUNNING;
    break;
  }
  SetServiceStatus(servicestatushandle, &servicestatus);
}