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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                   Microsoft RPC Version 2.0
  3.             Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                       Callback Example
  5.     FILE:       callc.c
  6.     USAGE:      callc  -n network_address
  7.                        -p protocol_sequence
  8.                        -e endpoint
  9.                        -o options
  10.                        -v value to compute fibonacci number
  11.     PURPOSE:    Client side of RPC distributed application
  12.     FUNCTIONS:  main() - binds to server and calls remote procedure
  13.     COMMENTS:   This sample program generates a Fibonacci number by
  14.                 static callback.
  15. ****************************************************************************/
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. #include "call.h"    // header file generated by MIDL compiler
  20. void Usage(char * pszProgramName)
  21. {
  22.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  23.     fprintf(stderr, " -p protocol_sequencen");
  24.     fprintf(stderr, " -n network_addressn");
  25.     fprintf(stderr, " -e endpointn");
  26.     fprintf(stderr, " -o optionsn");
  27.     fprintf(stderr, " -v value_for_Fibonaccin");
  28.     exit(1);
  29. }
  30. void _CRTAPI1 main(int argc, char **argv)
  31. {
  32.     RPC_STATUS status;
  33.     unsigned char * pszUuid             = NULL;
  34.     unsigned char * pszProtocolSequence = "ncacn_np";
  35.     unsigned char * pszNetworkAddress   = NULL;
  36.     unsigned char * pszEndpoint         = "\pipe\callback";
  37.     unsigned char * pszOptions          = NULL;
  38.     unsigned char * pszStringBinding    = NULL;
  39.     short sValue                        = 2;
  40.     short sFibNumber;
  41.     int i;
  42.     /* allow the user to override settings with command line switches */
  43.     for (i = 1; i < argc; i++) {
  44.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  45.             switch (tolower(*(argv[i]+1))) {
  46.             case 'p':  // protocol sequence
  47.                 pszProtocolSequence = argv[++i];
  48.                 break;
  49.             case 'n':  // network address
  50.                 pszNetworkAddress = argv[++i];
  51.                 break;
  52.             case 'e':
  53.                 pszEndpoint = argv[++i];
  54.                 break;
  55.             case 'o':
  56.                 pszOptions = argv[++i];
  57.                 break;
  58.             case 'v':
  59.                 sValue = atoi(argv[++i]);
  60.                 break;
  61.             case 'h':
  62.             case '?':
  63.             default:
  64.                 Usage(argv[0]);
  65.             }
  66.         }
  67.         else
  68.             Usage(argv[0]);
  69.     }
  70.     /* Use a convenience function to concatenate the elements of  */
  71.     /* the string binding into the proper sequence.               */
  72.     status = RpcStringBindingCompose(pszUuid,
  73.                                      pszProtocolSequence,
  74.                                      pszNetworkAddress,
  75.                                      pszEndpoint,
  76.                                      pszOptions,
  77.                                      &pszStringBinding);
  78.     printf("RpcStringBindingCompose returned 0x%xn", status);
  79.     printf("pszStringBinding = %sn", pszStringBinding);
  80.     if (status) {
  81.         exit(status);
  82.     }
  83.     /* Set the binding handle that will be used to bind to the server. */
  84.     status = RpcBindingFromStringBinding(pszStringBinding,
  85.                                          &callback_IfHandle);
  86.     printf("RpcBindingFromStringBinding returned 0x%xn", status);
  87.     if (status) {
  88.         exit(status);
  89.     }
  90.     printf("Calling 'Fibonacci(n)' for n = %dn", sValue);
  91.     RpcTryExcept {
  92.         sFibNumber = Fibonacci(sValue);  // make call
  93.         printf("The Fibonacci number of %d = %dn", sValue, sFibNumber);
  94.         printf("Calling the remote procedure 'Shutdown'n");
  95.         Shutdown();  // shut down the server side
  96.     }
  97.     RpcExcept(1) {
  98.         printf("Runtime reported exception %ldn", RpcExceptionCode() );
  99.     }
  100.     RpcEndExcept
  101.     /* The calls to the remote procedures are complete. */
  102.     /* Free the string and the binding handle           */
  103.     status = RpcStringFree(&pszStringBinding);  // remote calls done; unbind
  104.     printf("RpcStringFree returned 0x%xn", status);
  105.     if (status) {
  106.         exit(status);
  107.     }
  108.     status = RpcBindingFree(&callback_IfHandle);  // remote calls done; unbind
  109.     printf("RpcBindingFree returned 0x%xn", status);
  110.     if (status) {
  111.         exit(status);
  112.     }
  113.     exit(0);
  114. }  // end main()
  115. /* callback function */
  116. short Fibonacci2(short n)
  117. {
  118.     short nsub1, nsub2;
  119.     printf("Callback:  Fibonacci2 called with n = %dn", n);
  120.     if ((n == 0) || (n == 1))
  121.         return(1);
  122.     else {
  123.         nsub1 = n - 1;
  124.         nsub2 = n - 2;
  125.         return(Fibonacci(nsub1) + Fibonacci(nsub2));
  126.     }
  127. }
  128. /*********************************************************************/
  129. /*                 MIDL allocate and free                            */
  130. /*********************************************************************/
  131. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  132. {
  133.     return(malloc(len));
  134. }
  135. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  136. {
  137.     free(ptr);
  138. }
  139. /* end file callc.c */