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