|
|
1.1 ! root 1: /**************************************************************************** ! 2: Microsoft RPC Version 1.0 ! 3: Copyright Microsoft Corp. 1992 ! 4: Cluuid Example ! 5: ! 6: FILE: cluuids.c ! 7: ! 8: USAGE: cluuids -p protocol_sequence ! 9: -e endpoint ! 10: -m max calls ! 11: -n min calls ! 12: -f flag for RpcServerListen ! 13: -1 client object uuid ! 14: -2 manager epv uuid ! 15: ! 16: PURPOSE: Server side of RPC distributed application hello ! 17: ! 18: FUNCTIONS: main() - registers server as RPC server ! 19: ! 20: COMMENTS: Print "hello, world" on the server. ! 21: When you supply a type UUID, the client must ! 22: supply the same UUID. ! 23: ! 24: ****************************************************************************/ ! 25: ! 26: #include <stdio.h> ! 27: #include <stdlib.h> ! 28: #include <string.h> ! 29: #include <ctype.h> ! 30: #include "cluuid.h" // header file generated by MIDL compiler ! 31: ! 32: // the second implementation of the remote procedure ! 33: extern void HelloProc2(unsigned char * pszString); ! 34: ! 35: #define PURPOSE \ ! 36: "This Microsoft RPC Version 1.0 sample program demonstrates how\n\ ! 37: to supply multiple implementations of the remote procedure\n\ ! 38: specified in the interface. It also demonstrates how the client\n\ ! 39: selects among the implementations by providing a client object uuid.\n\n" ! 40: ! 41: #define NULL_UUID_STRING "00000000-0000-0000-0000-000000000000" ! 42: ! 43: void Usage(char * pszProgramName) ! 44: { ! 45: fprintf(stderr, "%s", PURPOSE); ! 46: fprintf(stderr, "Usage: %s\n", pszProgramName); ! 47: fprintf(stderr, " -p protocol_sequence\n"); ! 48: fprintf(stderr, " -e endpoint\n"); ! 49: fprintf(stderr, " -m maxcalls\n"); ! 50: fprintf(stderr, " -n mincalls\n"); ! 51: fprintf(stderr, " -f flag_wait_op\n"); ! 52: fprintf(stderr, " -1 client uuid\n"); ! 53: fprintf(stderr, " -2 manager uuid\n"); ! 54: exit(1); ! 55: } ! 56: ! 57: /* main: register the interface, start listening for clients */ ! 58: void _CRTAPI1 main(int argc, char * argv[]) ! 59: { ! 60: RPC_STATUS status; ! 61: UUID MgrTypeUuid, ClientUuid; ! 62: unsigned char * pszProtocolSequence = "ncacn_np"; ! 63: unsigned char * pszSecurity = NULL; ! 64: unsigned char * pszClientUuid = NULL_UUID_STRING; ! 65: unsigned char * pszMgrTypeUuid = "11111111-1111-1111-1111-111111111111"; ! 66: unsigned char * pszEndpoint = "\\pipe\\cluuid"; ! 67: unsigned int cMinCalls = 1; ! 68: unsigned int cMaxCalls = 20; ! 69: unsigned int fDontWait = FALSE; ! 70: int i; ! 71: ! 72: cluuid_SERVER_EPV epv2; // the mgr_epv for the 2nd implementation ! 73: ! 74: /* allow the user to override settings with command line switches */ ! 75: for (i = 1; i < argc; i++) { ! 76: if ((*argv[i] == '-') || (*argv[i] == '/')) { ! 77: switch (tolower(*(argv[i]+1))) { ! 78: case 'p': // protocol sequence ! 79: pszProtocolSequence = argv[++i]; ! 80: break; ! 81: case 'e': ! 82: pszEndpoint = argv[++i]; ! 83: break; ! 84: case 'm': ! 85: cMaxCalls = (unsigned int) atoi(argv[++i]); ! 86: break; ! 87: case 'n': ! 88: cMinCalls = (unsigned int) atoi(argv[++i]); ! 89: break; ! 90: case 'f': ! 91: fDontWait = (unsigned int) atoi(argv[++i]); ! 92: break; ! 93: case '1': ! 94: pszMgrTypeUuid = argv[++i]; ! 95: break; ! 96: case '2': ! 97: pszClientUuid = argv[++i]; ! 98: break; ! 99: case 'h': ! 100: case '?': ! 101: default: ! 102: Usage(argv[0]); ! 103: } ! 104: } ! 105: else ! 106: Usage(argv[0]); ! 107: } ! 108: ! 109: status = RpcServerUseProtseqEp(pszProtocolSequence, ! 110: cMaxCalls, ! 111: pszEndpoint, ! 112: pszSecurity); // Security descriptor ! 113: printf("RpcServerUseProtseqEp returned 0x%x\n", status); ! 114: if (status) { ! 115: exit(status); ! 116: } ! 117: ! 118: status = UuidFromString(pszClientUuid, &ClientUuid); ! 119: printf("UuidFromString returned 0x%x = %d\n", status, status); ! 120: if (status) { ! 121: exit(status); ! 122: } ! 123: ! 124: status = UuidFromString(pszMgrTypeUuid, &MgrTypeUuid); ! 125: printf("UuidFromString returned 0x%x = %d\n", status, status); ! 126: if (status) { ! 127: exit(status); ! 128: } ! 129: if (strcmp (pszMgrTypeUuid, NULL_UUID_STRING) == 0) { ! 130: printf("Register object using non-null uuid %s\n", pszMgrTypeUuid); ! 131: exit(1); ! 132: } ! 133: ! 134: if (strcmp (pszClientUuid, NULL_UUID_STRING) == 0) { ! 135: printf("Register object using non-null uuid %s\n", pszMgrTypeUuid); ! 136: ClientUuid = MgrTypeUuid; ! 137: } ! 138: ! 139: RpcObjectSetType(&ClientUuid, &MgrTypeUuid); // associate type UUID with nil UUID ! 140: printf("RpcObjectSetType returned 0x%x\n", status); ! 141: if (status) { ! 142: exit(status); ! 143: } ! 144: ! 145: status = RpcServerRegisterIf(cluuid_ServerIfHandle, // interface to register ! 146: NULL, // MgrTypeUuid ! 147: NULL); // MgrEpv; null means use default ! 148: printf("RpcServerRegisterIf returned 0x%x\n", status); ! 149: if (status) { ! 150: exit(status); ! 151: } ! 152: ! 153: /* register the second manager epv and associate it with the ! 154: specified uuid. the second uuid must be non-null so that ! 155: it will not conflict with the NULL uuid already registered ! 156: for this interface ! 157: */ ! 158: epv2.HelloProc = HelloProc2; ! 159: epv2.Shutdown = Shutdown; ! 160: status = RpcServerRegisterIf(cluuid_ServerIfHandle, // interface to register ! 161: &MgrTypeUuid, // MgrTypeUuid ! 162: &epv2); // 2nd manager epv ! 163: printf("RpcServerRegisterIf returned 0x%x\n", status); ! 164: if (status) { ! 165: exit(status); ! 166: } ! 167: ! 168: printf("Calling RpcServerListen\n"); ! 169: status = RpcServerListen(cMinCalls, ! 170: cMaxCalls, ! 171: fDontWait); ! 172: printf("RpcServerListen returned: 0x%x\n", status); ! 173: if (status) { ! 174: exit(status); ! 175: } ! 176: ! 177: if (fDontWait) { ! 178: printf("Calling RpcMgmtWaitServerListen\n"); ! 179: status = RpcMgmtWaitServerListen(); // wait operation ! 180: printf("RpcMgmtWaitServerListen returned: 0x%x\n", status); ! 181: if (status) { ! 182: exit(status); ! 183: } ! 184: } ! 185: ! 186: } // end main() ! 187: ! 188: ! 189: /*********************************************************************/ ! 190: /* MIDL allocate and free */ ! 191: /*********************************************************************/ ! 192: ! 193: void __RPC_FAR * __RPC_API midl_user_allocate(size_t len) ! 194: { ! 195: return(malloc(len)); ! 196: } ! 197: ! 198: void __RPC_API midl_user_free(void __RPC_FAR * ptr) ! 199: { ! 200: free(ptr); ! 201: } ! 202: ! 203: ! 204: /* end file cluuids.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.