home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / rpc / data / repas / repasc.c < prev    next >
C/C++ Source or Header  |  1996-06-11  |  8KB  |  202 lines

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                        repas Example
  5.  
  6.     FILE:       repasc.c
  7.  
  8.     USAGE:      repasc  -n network_address
  9.                        -p protocol_sequence
  10.                        -e endpoint
  11.                        -o options
  12.                        -c count of elements in linked list
  13.                        -v value of first element in linked list
  14.                        -d delta between values in linked list
  15.  
  16.     PURPOSE:    Client side of RPC distributed application.
  17.                 This sample demonstrates the represent_as example.
  18.                 A char string is sent over the network as a unicode string.
  19.  
  20.     RELATED:    repass.c - server main
  21.                 repasp.c - remote procedures
  22.                 repascu.c - client utility procedures
  23.  
  24.     FUNCTIONS:  main() - bind to server and call remote procedure
  25.  
  26.     COMMENTS:   This sample program generates a client and server can share
  27.                 an interface, but one side can use a different representation
  28.                 than the other.
  29.  
  30.                 The client side in this example does all operations using
  31.                 character strings, and the server side does all operations
  32.                 using UNICODE strings.  Two procedures are provided, one
  33.                 defined with ASCII strings, one with UNICODE strings.
  34.                 The wire format reflects these definitions, yet the client
  35.                 and server see pure ASCII and pure UNICODE respectively.
  36.  
  37.                 The [represent_as] attribute (used in the client and server
  38.                 side acf files) requires the four user-supplied functions
  39.                 whose names start with the name of the transmitted type
  40.                 (in the client side's case: WCHAR_STRING)
  41.  
  42.                 The [in, out] attributes applied to remote procedure
  43.                 parameters require the two user-supplied functions
  44.                 midl_user_allocate and midl_user_free.
  45.  
  46.                 The other functions are utilities that are used to
  47.                 build or display the data structures.
  48.  
  49.  
  50. ****************************************************************************/
  51.  
  52. #include <stdlib.h>
  53. #include <stdio.h>
  54. #include <ctype.h>
  55. #include "repasc.h"    // client's side header file generated by MIDL compiler
  56.  
  57. #define PURPOSE \
  58. "This Microsoft RPC Version 2.0 sample program demonstrates\n\
  59. the use of the [represent_as] attribute. For more information\n\
  60. about the attributes and the RPC API functions, see the\n\
  61. RPC programming guide and reference.\n\n"
  62.  
  63. #define MAX_ELEMENTS 50
  64.  
  65. void Usage(char * pszProgramName)
  66. {
  67.     fprintf(stderr, "%s", PURPOSE);
  68.     fprintf(stderr, "Usage:  %s\n", pszProgramName);
  69.     fprintf(stderr, " -p protocol_sequence\n");
  70.     fprintf(stderr, " -n network_address\n");
  71.     fprintf(stderr, " -e endpoint\n");
  72.     fprintf(stderr, " -o options\n");
  73.     fprintf(stderr, " -c count_of_elements\n");
  74.     fprintf(stderr, " -v value\n");
  75.     fprintf(stderr, " -d delta\n");
  76.     exit(1);
  77. }
  78.  
  79. void _CRTAPI1 main(int argc, char **argv)
  80. {
  81.     RPC_STATUS status;
  82.     unsigned char * pszUuid             = NULL;
  83.     unsigned char * pszProtocolSequence = "ncacn_np";
  84.     unsigned char * pszNetworkAddress   = NULL;
  85.     unsigned char * pszEndpoint         = "\\pipe\\repas";
  86.     unsigned char * pszOptions          = NULL;
  87.     unsigned char * pszStringBinding    = NULL;
  88.     int i;
  89.     int cElements = 10;
  90.     short sValue = 100;
  91.     short sDelta = 10;
  92.  
  93.     char    FirstBuffer[100];
  94.  
  95.     /* allow the user to override settings with command line switches */
  96.     for (i = 1; i < argc; i++) {
  97.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  98.             switch (tolower(*(argv[i]+1))) {
  99.             case 'p':  // protocol sequence
  100.                 pszProtocolSequence = argv[++i];
  101.                 break;
  102.             case 'n':  // network address
  103.                 pszNetworkAddress = argv[++i];
  104.                 break;
  105.             case 'e':
  106.                 pszEndpoint = argv[++i];
  107.                 break;
  108.             case 'o':
  109.                 pszOptions = argv[++i];
  110.                 break;
  111.             case 'c':
  112.                 cElements = atoi(argv[++i]);
  113.                 if (cElements > MAX_ELEMENTS)
  114.                     cElements = MAX_ELEMENTS;
  115.                 break;
  116.             case 'v':
  117.                 sValue = (short)atoi(argv[++i]);
  118.                 break;
  119.             case 'd':
  120.                 sDelta = (short)atoi(argv[++i]);
  121.                 break;
  122.             case 'h':
  123.             case '?':
  124.             default:
  125.                 Usage(argv[0]);
  126.             }
  127.         }
  128.         else
  129.             Usage(argv[0]);
  130.     }
  131.  
  132.     /* Use a convenience function to concatenate the elements of the string */
  133.     /* binding into the syntax needed by RpcBindingFromStringBinding.       */
  134.     status = RpcStringBindingCompose(pszUuid,
  135.                                      pszProtocolSequence,
  136.                                      pszNetworkAddress,
  137.                                      pszEndpoint,
  138.                                      pszOptions,
  139.                                      &pszStringBinding);
  140.     printf("RpcStringBindingCompose returned 0x%x\n", status);
  141.     printf("pszStringBinding = %s\n", pszStringBinding);
  142.     if (status) {
  143.         exit(status);
  144.     }
  145.  
  146.     /* Set the binding handle that will be used to bind to the server. */
  147.     status = RpcBindingFromStringBinding(pszStringBinding,
  148.                                          &hrepas);
  149.     printf("RpcBindingFromStringBinding returned 0x%x\n", status);
  150.     if (status) {
  151.         exit(status);
  152.     }
  153.  
  154.     RpcTryExcept {
  155.         // initialize a string to be shipped
  156.         strcpy(FirstBuffer,"This ASCII string is sent from the client to the server as UNICODE");
  157.  
  158.         printf("\nThe Client side is about to send:\n\"%s\"\n\n", FirstBuffer );
  159.  
  160.         printf("Calling the remote procedure 'ModifyMyWString'\n");
  161.         // note that the client sees the interface using ascii, not unicode
  162.         ModifyMyWString( &FirstBuffer );
  163.         printf("The Client side got back:\n\"%s\"\n\n", FirstBuffer );
  164.  
  165.  
  166.         // initialize a string to be shipped
  167.         strcpy(FirstBuffer,"And this ASCII string is sent from the client to the server as ASCII");
  168.  
  169.         printf("The Client side is about to send:\n\"%s\"\n\n", FirstBuffer );
  170.         printf("Calling the remote procedure 'ModifyMyString'\n");
  171.         // note that the client sees the interface using ascii
  172.         ModifyMyString( &FirstBuffer );
  173.         printf("The Client side got back:\n\"%s\"\n\n", FirstBuffer );
  174.  
  175.         printf("Calling the remote procedure 'Shutdown'\n");
  176.         Shutdown();  // shut down the server side
  177.     }
  178.     RpcExcept(1) {
  179.         printf("Runtime reported exception %ld\n", RpcExceptionCode() );
  180.     }
  181.     RpcEndExcept
  182.  
  183.     /* The calls to the remote procedures are complete.            */
  184.     /* Free the string and the binding handle using RPC API calls. */
  185.     status = RpcStringFree(&pszStringBinding);
  186.     printf("RpcStringFree returned 0x%x\n", status);
  187.     if (status) {
  188.         exit(status);
  189.     }
  190.  
  191.     status = RpcBindingFree(&hrepas);
  192.     printf("RpcBindingFree returned 0x%x\n", status);
  193.     if (status) {
  194.         exit(status);
  195.     }
  196.  
  197.     exit(0);
  198.  
  199. }  // end main()
  200.  
  201. /* end file repasc.c */
  202.