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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                       InOut Example
  5.     FILE:       inoutc.c
  6.     USAGE:      inoutc   -n network_address
  7.                          -p protocol_sequence
  8.                          -e endpoint
  9.                          -o options
  10.                          -1 short_value_1
  11.                          -2 short_value_2
  12.                          -3 float_value_3
  13.     PURPOSE:    Client side of RPC distributed application inout
  14.     FUNCTIONS:  main() - binds to server and calls remote procedure
  15.     COMMENTS:   This distributed application demonstrates in, out
  16.                 parameters.
  17. ****************************************************************************/
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <ctype.h>
  21. #include "inout.h"    // header file generated by MIDL compiler
  22. #define PURPOSE 
  23. "This Microsoft RPC Version 2.0 sample program demonstratesn
  24. use of the [in], [out], and [in, out] attributes. For moren
  25. information about attributes and RPC API functions, see then
  26. Microsoft RPC programming guide and reference.nn"
  27. #define DESCRIPTION 
  28. "One [in], one [out], and one [in,out] parameter are definedn
  29. for the function InOutProc(). This program displays the valuesn
  30. of these parameters before and after the remote procedure call.nn"
  31. void Usage(char * pszProgramName)
  32. {
  33.     fprintf(stderr, "%s", PURPOSE);
  34.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  35.     fprintf(stderr, " -p protocol_sequencen");
  36.     fprintf(stderr, " -n network_addressn");
  37.     fprintf(stderr, " -e endpointn");
  38.     fprintf(stderr, " -o optionsn");
  39.     fprintf(stderr, " -1 parameter_1n");
  40.     fprintf(stderr, " -2 parameter_2n");
  41.     fprintf(stderr, " -3 parameter_3n");
  42.     exit(1);
  43. }
  44. void _CRTAPI1 main(int argc, char **argv)
  45. {
  46.     RPC_STATUS status;
  47.     unsigned char * pszUuid             = NULL;
  48.     unsigned char * pszProtocolSequence = "ncacn_np";
  49.     unsigned char * pszNetworkAddress   = NULL;
  50.     unsigned char * pszEndpoint         = "\pipe\inout";
  51.     unsigned char * pszOptions          = NULL;
  52.     unsigned char * pszStringBinding    = NULL;
  53.     short   s1 = 257;
  54.     short   s2 = 631;
  55.     float   f3 = (float) 0.406;
  56.     int i;
  57.     /* allow the user to override settings with command line switches */
  58.     for (i = 1; i < argc; i++) {
  59.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  60.             switch (tolower(*(argv[i]+1))) {
  61.             case 'p':  // protocol sequence
  62.                 pszProtocolSequence = argv[++i];
  63.                 break;
  64.             case 'n':  // network address
  65.                 pszNetworkAddress = argv[++i];
  66.                 break;
  67.             case 'e':
  68.                 pszEndpoint = argv[++i];
  69.                 break;
  70.             case 'o':
  71.                 pszOptions = argv[++i];
  72.                 break;
  73.             case '1':
  74.                 s1 = (short) atoi(argv[++i]);
  75.                 break;
  76.             case '2':
  77.                 s2 = (short) atoi(argv[++i]);
  78.                 break;
  79.             case '3':
  80.                 f3 = (float) atof(argv[++i]);
  81.                 break;
  82.             case 'h':
  83.             case '?':
  84.             default:
  85.                 Usage(argv[0]);
  86.             }
  87.         }
  88.         else
  89.             Usage(argv[0]);
  90.     }
  91.     printf("%s", DESCRIPTION);
  92.     /* Use a convenience function to concatenate the elements of  */
  93.     /* the string binding into the proper sequence.               */
  94.     status = RpcStringBindingCompose(pszUuid,
  95.                                      pszProtocolSequence,
  96.                                      pszNetworkAddress,
  97.                                      pszEndpoint,
  98.                                      pszOptions,
  99.                                      &pszStringBinding);
  100.     printf("RpcStringBindingCompose returned 0x%xn", status);
  101.     printf("pszStringBinding = %sn", pszStringBinding);
  102.     if (status) {
  103.         exit(status);
  104.     }
  105.     /* Set the binding handle that will be used to bind to the server. */
  106.     status = RpcBindingFromStringBinding(pszStringBinding,
  107.                                          &inout_IfHandle);
  108.     printf("RpcBindingFromStringBinding returned 0x%xn", status);
  109.     if (status) {
  110.         exit(status);
  111.     }
  112.     printf("Calling the remote procedure 'InOutProc'n");
  113.     printf("  parameters = %d %d %0.3fn", s1, s2, f3);
  114.     RpcTryExcept {
  115.         InOutProc(s1, &s2, &f3);  // call the remote procedure
  116.         printf("Returning from the remote procedure 'InOutProc'n");
  117.         printf("  parameters = %d %d %0.3fn", s1, s2, f3);
  118.         Shutdown();
  119.     }
  120.     RpcExcept(1) {
  121.         printf("Runtime reported exception %ldn", RpcExceptionCode() );
  122.     }
  123.     RpcEndExcept
  124.     /* The call to the remote procedure is complete. */
  125.     /* Free the string and binding handle.           */
  126.     status = RpcBindingFree(&inout_IfHandle);
  127.     printf("RpcBindingFree returned 0x%xn", status);
  128.     if (status) {
  129.         exit(status);
  130.     }
  131.     status = RpcStringFree(&pszStringBinding);
  132.     printf("RpcStringFree returned 0x%xn", status);
  133.     if (status) {
  134.         exit(status);
  135.     }
  136.     exit(0);
  137. }  // end main()
  138. /*********************************************************************/
  139. /*                 MIDL allocate and free                            */
  140. /*********************************************************************/
  141. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  142. {
  143.     return(malloc(len));
  144. }
  145. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  146. {
  147.     free(ptr);
  148. }
  149. /* end file inoutc.c */