CLUUIDC.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.                        Cluuid Example
  5.     FILE:        cluuidc.c
  6.     USAGE:       cluuidc  -n network_address
  7.                           -p protocol_sequence
  8.                           -e endpoint
  9.                           -o options
  10.                           -s string_displayed_on_server
  11.                           -u client object uuid
  12.     PURPOSE:     Client side of RPC distributed application
  13.     FUNCTIONS:   main() - binds to server and calls remote procedure
  14.     COMMENTS:    This distributed application prints a string such as
  15.                  "hello, world" on the server. The client manages its
  16.                  connection to the server. The client uses the implicit
  17.                  binding handle ImpHandle defined in the file cluuid.h.
  18. ****************************************************************************/
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <ctype.h>
  22. #include "cluuid.h"    // header file generated by MIDL compiler
  23. void Usage(char * pszProgramName)
  24. {
  25.     fprintf(stderr, "Usage:  %sn", pszProgramName);
  26.     fprintf(stderr, " -p protocol_sequencen");
  27.     fprintf(stderr, " -n network_addressn");
  28.     fprintf(stderr, " -e endpointn");
  29.     fprintf(stderr, " -o optionsn");
  30.     fprintf(stderr, " -s stringn");
  31.     fprintf(stderr, " -u uuidn");
  32.     exit(1);
  33. }
  34. void _CRTAPI1 main(int argc, char **argv)
  35. {
  36.     RPC_STATUS status;
  37.     unsigned char * pszUuid             = NULL;
  38.     unsigned char * pszProtocolSequence = "ncacn_np";
  39.     unsigned char * pszNetworkAddress   = NULL;
  40.     unsigned char * pszEndpoint         = "\pipe\cluuid";
  41.     unsigned char * pszOptions          = NULL;
  42.     unsigned char * pszStringBinding    = NULL;
  43.     unsigned char * pszString           = "hello, world";
  44.     unsigned long ulCode;
  45.     int i;
  46.     /* allow the user to override settings with command line switches */
  47.     for (i = 1; i < argc; i++) {
  48.         if ((*argv[i] == '-') || (*argv[i] == '/')) {
  49.             switch (tolower(*(argv[i]+1))) {
  50.             case 'p':  // protocol sequence
  51.                 pszProtocolSequence = argv[++i];
  52.                 break;
  53.             case 'n':  // network address
  54.                 pszNetworkAddress = argv[++i];
  55.                 break;
  56.             case 'e':
  57.                 pszEndpoint = argv[++i];
  58.                 break;
  59.             case 'o':
  60.                 pszOptions = argv[++i];
  61.                 break;
  62.             case 's':
  63.                 pszString = argv[++i];
  64.                 break;
  65.             case 'u':
  66.                 pszUuid = argv[++i];
  67.                 break;
  68.             case 'h':
  69.             case '?':
  70.             default:
  71.                 Usage(argv[0]);
  72.             }
  73.         }
  74.         else
  75.             Usage(argv[0]);
  76.     }
  77.     /* Use a convenience function to concatenate the elements of  */
  78.     /* the string binding into the proper sequence.               */
  79.     status = RpcStringBindingCompose(pszUuid,
  80.                                      pszProtocolSequence,
  81.                                      pszNetworkAddress,
  82.                                      pszEndpoint,
  83.                                      pszOptions,
  84.                                      &pszStringBinding);
  85.     printf("RpcStringBindingCompose returned 0x%xn", status);
  86.     printf("pszStringBinding = %sn", pszStringBinding);
  87.     if (status) {
  88.         exit(status);
  89.     }
  90.     /* Set the binding handle that will be used to bind to the server. */
  91.     status = RpcBindingFromStringBinding(pszStringBinding,
  92.                                          &ImpHandle);
  93.     printf("RpcBindingFromStringBinding returned 0x%xn", status);
  94.     if (status) {
  95.         exit(status);
  96.     }
  97.     printf("Calling the remote procedure 'HelloProc'n");
  98.     printf("  print the string '%s' on the servern", pszString);
  99.     RpcTryExcept {
  100.         HelloProc(pszString);  /* make call with user message */
  101.         printf("Calling the remote procedure 'Shutdown'n");
  102.         Shutdown();             // shut down the server side
  103.     }
  104.     RpcExcept(1) {
  105.         ulCode = RpcExceptionCode();
  106.         printf("Runtime reported exception 0x%lx = %ldn", ulCode, ulCode);
  107.     }
  108.     RpcEndExcept
  109.     /*  The calls to the remote procedures are complete. */
  110.     /*  Free the string and the binding handle           */
  111.     status = RpcStringFree(&pszStringBinding);  // remote calls done; unbind
  112.     printf("RpcStringFree returned 0x%xn", status);
  113.     if (status) {
  114.         exit(status);
  115.     }
  116.     status = RpcBindingFree(&ImpHandle);  // remote calls done; unbind
  117.     printf("RpcBindingFree returned 0x%xn", status);
  118.     if (status) {
  119.         exit(status);
  120.     }
  121.     exit(0);
  122. }
  123. /*********************************************************************/
  124. /*                 MIDL allocate and free                            */
  125. /*********************************************************************/
  126. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  127. {
  128.     return(malloc(len));
  129. }
  130. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  131. {
  132.     free(ptr);
  133. }
  134. /* end file cluuidc.c */