|
|
1.1 root 1: /****************************************************************************
2: Microsoft RPC Version 1.0
3: Copyright Microsoft Corp. 1992
4: Discrimination Union Example
5:
6: FILE: dunionc.c
7: USAGE: dunionc -n network_address
8: -p protocol_sequence
9: -e endpoint
10: -o options
11: -u uuid
12: -s string
13: -d discriminant
14: -v union_value
15:
16: PURPOSE: Client side of RPC distributed application
17: FUNCTIONS: main() - binds to server and calls remote procedure
18: COMMENTS:
19:
20: ****************************************************************************/
21: #include <stdio.h>
22: #include <string.h>
23: #include <stdlib.h>
24: #include <rpc.h> // RPC API functions, types
25: #include "dunion.h" // header file generated by MIDL compiler
26:
27: short sDiscrim = 0;
28: DISCRIM_UNION_PARAM_TYPE up = {1};
29: DISCRIM_UNION_STRUCT_TYPE us = {0, 1};
30:
31: void Usage(char * pszProgramName)
32: {
33: fprintf(stderr, "Usage: %s\n", pszProgramName);
34: fprintf(stderr, " -p protocol_sequence\n");
35: fprintf(stderr, " -n network_address\n");
36: fprintf(stderr, " -e endpoint\n");
37: fprintf(stderr, " -o options\n");
38: fprintf(stderr, " -u uuid\n");
39: fprintf(stderr, " -s string\n");
40: fprintf(stderr, " -d discriminant\n");
41: fprintf(stderr, " -v union_value\n");
42: exit(1);
43: }
44:
45: void DisplayUnionValue(void)
46: {
47: printf("sDiscrim = %d, data = ", sDiscrim);
48: switch(sDiscrim) {
49: case 0:
50: printf("short: %d\n", up.sVal);
51: break;
52: case 1:
53: printf("float: %f\n", up.fVal);
54: break;
55: case 2:
56: printf("char: %c\n", up.chVal);
57: break;
58: default:
59: sDiscrim = 0;
60: break;
61: }
62: }
63:
64: void * MIDL_user_allocate(size_t len)
65: {
66: return(malloc(len));
67: }
68:
69: void MIDL_user_free(void * ptr)
70: {
71: free(ptr);
72: }
73:
74:
75: void main(int argc, char **argv)
76: {
77: RPC_STATUS status; // returned by RPC API function
78: unsigned char * pszUuid = "12345678-1234-1234-1234-123456789ABC";
79: unsigned char * pszProtocolSequence = "ncacn_np";
80: unsigned char * pszNetworkAddress = NULL;
81: unsigned char * pszEndpoint = "\\pipe\\dunion";
82: unsigned char * pszOptions = NULL;
83: unsigned char * pszStringBinding = NULL;
84: int i;
85:
86: up.sVal = 1;
87: // allow the user to override settings with command line switches
88: for (i = 1; i < argc; i++) {
89: if ((*argv[i] == '-') || (*argv[i] == '/')) {
90: switch (tolower(*(argv[i]+1))) {
91: case 'p': // protocol sequence
92: pszProtocolSequence = argv[++i];
93: break;
94: case 'n': // network address
95: pszNetworkAddress = argv[++i];
96: break;
97: case 'e':
98: pszEndpoint = argv[++i];
99: break;
100: case 'o':
101: pszOptions = argv[++i];
102: break;
103: case 'u':
104: pszUuid = argv[++i];
105: break;
106: case 'd':
107: sDiscrim = (short) atoi(argv[++i]);
108: if ((sDiscrim > 3) || (sDiscrim < 0))
109: sDiscrim = 0;
110: us.sDiscrim = sDiscrim;
111: break;
112: case 'v':
113: switch(sDiscrim) {
114: case 0:
115: up.sVal = (short) atoi(argv[++i]);
116: us.u.sVal = up.sVal;
117: break;
118: case 1:
119: up.fVal = (float) atof(argv[++i]);
120: us.u.fVal = up.fVal;
121: break;
122: case 2:
123: up.chVal = *(argv[++i]);
124: us.u.chVal = up.chVal;
125: break;
126: default:
127: break;
128: }
129: case 'h':
130: case '?':
131: default:
132: Usage(argv[0]);
133: }
134: }
135: else
136: Usage(argv[0]);
137: }
138: /* Use a convenience function to concatenate the elements of */
139: /* the string binding into the proper sequence. */
140:
141: status = RpcStringBindingCompose(pszUuid,
142: pszProtocolSequence,
143: pszNetworkAddress,
144: pszEndpoint,
145: pszOptions,
146: &pszStringBinding);
147: printf("RpcStringBindingCompose returned 0x%x\n", status);
148: printf("pszStringBinding = %s\n", pszStringBinding);
149: if (status)
150: exit(2);
151:
152: /* Set the binding handle that will be used to bind to the server. */
153:
154: status = RpcBindingFromStringBinding(pszStringBinding,
155: &hDiscrim);
156: printf("RpcBindingFromStringBinding returned 0x%x\n", status);
157: if (status)
158: exit(2);
159:
160: printf("Calling the remote procedure 'UnionParamProc'\n");
161:
162: DisplayUnionValue(); // display value before call
163: UnionParamProc(up, sDiscrim); // call the remote procedure
164:
165: UnionStructProc(us);
166: DisplayUnionValue(); // display value after call
167:
168: Shutdown(); // Shut down the server
169:
170: /* The remote procedure call is complete. Free the binding handle */
171: status = RpcBindingFree(&hDiscrim); // remote calls done; unbind
172: printf("RpcBindingFree returned 0x%x\n", status);
173: if (status)
174: exit(2);
175:
176: exit(0);
177: }
178:
179: /* end dunionc.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.