RPCSSMP.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                         rpcssm Example
  5.     FILE:       rpcssmp.c
  6.     PURPOSE:    Remote procedures used in server application rpcssms
  7.     FUNCTIONS:  InOutList() - Adds new nodes to the list.
  8.     COMMENTS:   This distributed application uses the rpcssm package.
  9. ****************************************************************************/
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include "rpcssm.h"    // header file generated by MIDL compiler
  14. void AllocateSmList( PBOX * ppBox, short sListSize );
  15. void InitList( PBOX  pBox, long lStartValue );
  16. void PrintList( PBOX pBox );
  17. void * pvPersistent    = NULL;
  18. void * pvNonPersistent = NULL;
  19. void
  20. InOutList( PBOX * ppBox )
  21. {
  22.     /* As this routine executes in the enabled memory environment,
  23.        a convienient way to allocate a non-persistent memory
  24.        is to use RpcSmAllocate or RpcSsAllocate.
  25.     */
  26.     if ( ppBox) {
  27.         PBOX p = *ppBox;
  28.         while ( p->next )
  29.             p = p->next;
  30.         AllocateSmList( & p->next, 2 );
  31.     }
  32.     else {
  33.         AllocateSmList( ppBox, 5 );
  34.     }
  35.     InitList( *ppBox, 0x98760000 );
  36.     PrintList( *ppBox );
  37.     /* To allocate a memory to be available after the call, means other
  38.        than RpcS*Allocate with default allocators should be used.
  39.     */
  40.     if ( pvPersistent == NULL )
  41.         {
  42.         pvPersistent = malloc(100); /* or midl_user_allocate(100) */
  43.         }
  44.     pvNonPersistent = RpcSsAllocate( 100 );
  45. }
  46. /* The Shutdown procedure tells the server to stop listening */
  47. /* for client requests.                                      */
  48. void Shutdown(void)
  49. {
  50.     RPC_STATUS status;
  51.     /* Freeing the persistent memory */
  52.     if ( pvPersistent )
  53.         free( pvPersistent );
  54.     printf("Calling RpcMgmtStopServerListeningn");
  55.     status = RpcMgmtStopServerListening(NULL);
  56.     printf("RpcMgmtStopServerListening returned: 0x%xn", status);
  57.     if (status) {
  58.         exit(status);
  59.     }
  60.     printf("Calling RpcServerUnregisterIfn");
  61.     status = RpcServerUnregisterIf(NULL, NULL, FALSE);
  62.     printf("RpcServerUnregisterIf returned 0x%xn", status);
  63.     if (status) {
  64.         exit(status);
  65.     }
  66. }
  67. //=====================================================================
  68. //        List allocation/deallocation routines
  69. //=====================================================================
  70. void
  71. AllocateSmList( PBOX * ppBox, short sListSize)
  72. {
  73.     PBOX    pBox, head;
  74.     int     i = 0;
  75.     //.. Allocate a list of boxes, if needed (when *ppBox==NULL).
  76.     if ( *ppBox == NULL ) {
  77.         RPC_STATUS status;
  78.         head = 0;
  79.         for (i = 0; i < sListSize; i++)
  80.         {
  81.             pBox = (PBOX) RpcSmAllocate( sizeof(LBOX), &status);
  82.             if ( status != RPC_S_OK )
  83.             {
  84.                 printf("AllocateList FAILED: not enough memoryn");
  85.                 break;
  86.             }
  87.             pBox->next = head;
  88.             head = pBox;
  89.         }
  90.         *ppBox = head;
  91.     }
  92.     printf("%d nodes allocated.n", i);
  93. }
  94. //=====================================================================
  95. //        Initialization and pprint routines
  96. //=====================================================================
  97. void  InitList( PBOX  pBox, long lStartValue )
  98. {
  99.     int i = 0;
  100.     while( pBox ) {
  101.         pBox->data = lStartValue + ++i;
  102.         pBox = pBox->next;
  103.     }
  104.     printf("%d nodes inited.n", i);
  105. }
  106. // --------------------------------------------------------------------
  107. void
  108. PrintList( PBOX  pBox )
  109. {
  110.     int i = 0;
  111.     while( pBox ) {
  112.         if ( (i % 4) != 0 )
  113.             printf("  data[%d]= %lx", i, pBox->data);
  114.         else
  115.             printf("n  data[%d]= %lx", i, pBox->data);
  116.         pBox = pBox->next;
  117.         i++;
  118.     }
  119.     printf("n" );
  120. }
  121. /* end file rpcssmp.c */