DYNEPTC.C
/**************************************************************************** 
                   Microsoft RPC Version 2.0 
           Copyright Microsoft Corp. 1992, 1993, 1994- 1996 
                       Dynept Example 
 
    FILE:       dyneptc.c 
 
    USAGE:      dyneptc  -n network_address 
                         -p protocol_sequence 
                         -o options 
                         -s string_displayed_on_server 
 
    PURPOSE:    Client side of RPC distributed application 
 
    FUNCTIONS:  main() - binds to server and calls remote procedure 
 
    COMMENTS:   This version of the distributed application that 
                prints "What a dynamic, world" (or other string) on 
                the server features a client that manages its connection 
                to the server. It uses the binding handle dynept_IfHandle, 
                defined in the file dynept.h. 
 
****************************************************************************/ 
 
#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 
#include "dynept.h"    // header file generated by MIDL compiler 
 
void Usage(char * pszProgramName) 
{ 
    fprintf(stderr, "Usage:  %s\n", pszProgramName); 
    fprintf(stderr, " -p protocol_sequence\n"); 
    fprintf(stderr, " -n network_address\n"); 
    fprintf(stderr, " -o options\n"); 
    fprintf(stderr, " -s string\n"); 
    exit(1); 
} 
 
void _CRTAPI1 main(int argc, char **argv) 
{ 
    RPC_STATUS status; 
    unsigned char * pszUuid             = NULL; 
    unsigned char * pszProtocolSequence = "ncacn_np"; 
    unsigned char * pszNetworkAddress   = NULL; 
    unsigned char * pszOptions          = NULL; 
    unsigned char * pszStringBinding    = NULL; 
    unsigned char * pszString           = "What a dynamic world"; 
    unsigned long ulCode; 
    int i; 
 
    /* allow the user to override settings with command line switches */ 
    for (i = 1; i < argc; i++) { 
        if ((*argv[i] == '-') || (*argv[i] == '/')) { 
            switch (tolower(*(argv[i]+1))) { 
            case 'p':  // protocol sequence 
                pszProtocolSequence = argv[++i]; 
                break; 
            case 'n':  // network address 
                pszNetworkAddress = argv[++i]; 
                break; 
            case 'o': 
                pszOptions = argv[++i]; 
                break; 
            case 's': 
                pszString = argv[++i]; 
                break; 
            case 'h': 
            case '?': 
            default: 
                Usage(argv[0]); 
            } 
        } 
        else 
            Usage(argv[0]); 
    } 
 
    /* Use a convenience function to concatenate the elements of */ 
    /* the string binding into the proper sequence.              */ 
    status = RpcStringBindingCompose(pszUuid, 
                                     pszProtocolSequence, 
                                     pszNetworkAddress, 
                                     NULL, 
                                     pszOptions, 
                                     &pszStringBinding); 
    printf("RpcStringBindingCompose returned 0x%x\n", status); 
    printf("pszStringBinding = %s\n", pszStringBinding); 
    if (status) { 
        exit(status); 
    } 
 
    /* Set the binding handle that will be used to bind to the server. */ 
    status = RpcBindingFromStringBinding(pszStringBinding, 
                                         &dynept_IfHandle); 
    printf("RpcBindingFromStringBinding returned 0x%x\n", status); 
    if (status) { 
        exit(status); 
    } 
 
    printf("Calling the remote procedure 'HelloProc'\n"); 
    printf("Print the string '%s' on the server\n", pszString); 
 
    RpcTryExcept { 
        HelloProc(pszString);  // make call with user message 
        printf("Calling the remote procedure 'Shutdown'\n"); 
        Shutdown();  // shut down the server side 
    } 
    RpcExcept(1) { 
        ulCode = RpcExceptionCode(); 
        printf("Runtime reported exception 0x%lx = %ld\n", ulCode, ulCode); 
    } 
    RpcEndExcept 
 
    /*  The calls to the remote procedures are complete. */ 
    /*  Free the string and the binding handle           */ 
    status = RpcStringFree(&pszStringBinding);  // remote calls done; unbind 
    printf("RpcStringFree returned 0x%x\n", status); 
    if (status) { 
        exit(status); 
    } 
 
    status = RpcBindingFree(&dynept_IfHandle);  // remote calls done; unbind 
    printf("RpcBindingFree returned 0x%x\n", status); 
    if (status) { 
        exit(status); 
    } 
 
    exit(0); 
 
}  // end main() 
 
 
/*********************************************************************/ 
/*                 MIDL allocate and free                            */ 
/*********************************************************************/ 
 
void  __RPC_FAR * __RPC_USER midl_user_allocate(size_t len) 
{ 
    return(malloc(len)); 
} 
 
void __RPC_USER midl_user_free(void __RPC_FAR * ptr) 
{ 
    free(ptr); 
} 
 
/* end file dyneptc.c */