|
|
1.1 root 1: More Information about Microsoft RPC version 1.0
2: ____________________________________________________________
3:
4: This document contains important information about Microsoft
5: RPC version 1.0 that is not included in the Microsoft RPC
6: Programmer's Guide and Reference or in online help.
7:
8: Using Notepad to View This Document
9:
10: To move through this document, press PAGE UP and PAGE DOWN
11: or click the arrows at the top and bottom of the scroll bar
12: along the right side of the window.
13:
14: To print this document, choose the Print command from the
15: File menu.
16:
17: For Help on using Notepad, press F1.
18:
19: ____________________________________________________________
20:
21: Introduction
22:
23: Microsoft RPC SDK version 1.0 is a toolkit for developing
24: network-aware distributed applications in C/C++. The RPC
25: toolkit includes:
26:
27: MIDL compilers for Microsoft Windows NT and MS-DOS
28: C/C++ language header files and run-time libraries for
29: Microsoft Windows NT, Microsoft Windows, and MS-DOS
30: Sample programs for Microsoft Windows NT, Microsoft
31: Windows, and MS-DOS
32: RPC reference online help files and PostScript(TM)
33: files
34:
35: The Microsoft Windows NT SDK contains both the Microsoft
36: Windows NT and Microsoft Windows 3.x/MS-DOS versions of the
37: RPC SDK.
38:
39: Installation
40:
41: The Microsoft Windows NT SDK installs the components of the
42: Microsoft Windows NT RPC SDK as part of its standard
43: installation. No additional installation is required.
44:
45: You must install the Microsoft Windows 3.x and MS-DOS
46: versions of the RPC toolkit. This software requires:
47:
48: Microsoft C/C++ version 7.0
49: DOS Protected Mode Interface (DPMI) server that
50: supports version 0.9 or later of the DPMI specification and
51: the MS-DOS extensions to the DPMI (or Microsoft Windows 3.1)
52: Microsoft LAN Manager version 2.1 with NetBEUI, Named
53: Pipes, or TCP/IP
54:
55: To install the Microsoft Windows and MS-DOS version of the
56: RPC toolkit, run the Setup program that is available in the
57: directory NT\MSTOOLS\RPC_DOS\NSETUP under Microsoft Windows 3.x.
58:
59: The environment variables INCLUDE, LIB, and PATH should be
60: set to point to the directories that contain the Microsoft
61: C/C++ version 7.0 development tools. (The C/C++ version 7.0
62: installation program sets these environment variables.)
63:
64: RPC Documentation
65:
66: The following Microsoft RPC version 1.0 reference materials
67: are available in published book form and in PostScript file
68: format:
69:
70: RPC Programmer's Guide and Reference
71: Part I: Programmer's Guide
72: Part II: Run-time API Reference
73: Part III: MIDL Language Reference
74:
75: The PostScript files allow you to print individual chapters
76: of the documentation on your own PostScript printer.
77:
78: The following run-time and MIDL reference help files are
79: available on line:
80:
81: RPC10WH.HLP WinHelp run-time API reference
82: RPC10QH.HLP QuickHelp run-time API reference
83: MIDL10WH.HLP WinHelp MIDL reference
84: MIDL10QH.HLP QuickHelp MIDL reference
85:
86: RPC sample program source files are available in the
87: directory NT\MSTOOLS\SAMPLES\RPC. The file
88: NT\MSTOOLS\SAMPLES\RPC\README.TXT describes each sample.
89:
90: ____________________________________________________________
91:
92: Contents
93:
94: This document contains additional information on the
95: following topics:
96:
97: 1.0 DCE interoperability issues
98:
99: 2.0 Packing and alignment considerations
100:
101: 3.0 String arrays not transmitted correctly; use pointers
102:
103: 4.0 MIDL switch "-env generic" not supported
104:
105: 5.0 Cast char constants as small in OSF compatibility mode
106:
107: 6.0 MIDL type wchar_t not supported in all modes
108:
109: 7.0 MIDL attribute pointer_default() not OSF compatible
110:
111: 8.0 MIDL interprets "handle" in attribute list as keyword
112:
113: 9.0 C stub source code causes compilation warnings
114:
115: 10.0 Use tagged structure declarations
116:
117: 11.0 Unsized arrays not supported
118:
119: 12.0 Updated command line help for the MIDL compiler
120:
121: 13.0 RpcBindingToStringBinding does not return network address
122:
123: 14.0 RpcServerUseAllProtseqs, RpcNetworkInqProtseqs incomplete
124:
125: 15.0 DCE error codes not mapped to Win32 error codes
126:
127: 16.0 Using the MS-DOS UuidGen utility with Microsoft Windows NT
128:
129: 17.0 Creating installation disks for your application
130:
131: 18.0 New LAN Manager 2.1 DLL required for Windows clients
132:
133: 19.0 Running the locator and endpoint mapper
134:
135: 20.0 Updating RPC registry entries for new NetBIOS configurations
136:
137: 21.0 RPC application exception handling for Microsoft Windows 3.x
138:
139: ____________________________________________________________
140:
141: 1.0 DCE interoperability issues
142:
143: The Microsoft implementations of the name service and
144: endpoint mapper that are provided with this release of
145: Microsoft RPC version 1.0 do not interoperate with DCE
146: implementations.
147:
148: The endpoint mapper is the equivalent of the DCE RPC daemon
149: rpcd. DCE clients cannot resolve endpoints from the
150: Microsoft endpoint mapper and Microsoft clients cannot
151: resolve endpoints from the DCE RPC daemon rpcd.
152:
153: This release of Microsoft RPC version 1.0 defines the type
154: error_status_t as unsigned short. DCE implementations define
155: error_status_t as unsigned long.
156:
157: Full pointers (pointers associated with the attribute [ptr])
158: are not completely implemented in this release of Microsoft
159: RPC version 1.0. To allow portability of DCE applications,
160: MIDL treats full pointers as unique pointers, which means
161: that aliasing is not supported. The use of full pointers
162: that cause aliasing can cause undefined results.
163:
164: DCE host names are case-sensitive. Specify the hostname
165: exactly as it appears or the client will not be able to
166: locate the host server.
167:
168: Other differences between the Microsoft and DCE
169: implementations are documented in the RPC Programmer's Guide
170: and Reference.
171:
172: 2.0 Packing and Alignment Considerations
173:
174: You must use the same packing and alignment settings (/Zp
175: switch) with both the C compiler and the MIDL compiler.
176: Using different packing levels for each compiler causes
177: undefined results. Default values are set for each target
178: operating system. You can specify the /Zp switch to verify
179: that the correct packing and alignment settings are used on
180: both compilers.
181:
182: For Microsoft Windows 3.x and MS-DOS-based distributed
183: applications, use one of the following two methods:
184:
185: a. Compile using /Zp2 with both the MIDL and C compilers
186:
187: b. Compile using any /Zp level (use the same level
188: for both the MIDL and C compilers; the level /Zp4 produces
189: the most efficient marshalling code) and add the following
190: code to the files RPC.H and RPCNDR.H:
191:
192: #pragma pack(2) /* at start of rpc.h and rpcndr.h */
193: ...
194: #pragma pack () /* at end, restore default level */
195:
196: 3.0 String arrays not transmitted correctly; use pointers
197:
198: Arrays of strings are not transmitted correctly in some
199: cases because the MIDL compiler contains a known software
200: error that leads to incorrect stub source files. In this
201: release, avoid the use of such string arrays as the
202: following:
203:
204: typedef [string] char str[80];
205: void foo([out,length_is(*len)] str array[100],
206: [out] short *len);
207:
208: In this release of Microsoft RPC version 1.0, an [out] array
209: of string pointers must be initialized with valid non-null
210: values before the remote procedure call. When an array of
211: null pointer values is transmitted to the server, the stub
212: does not correctly allocate storage for the strings on
213: return to the client. For example, the array pArray must be
214: initialized:
215:
216: typedef [string] char * PSTRINGTYPE;
217: void OutStringSArray(
218: [in, out] long * psize,
219: [out, size_is(*psize)] PSTRINGTYPE * pArray);
220:
221: 4.0 MIDL switch "-env generic" not supported
222:
223: The MIDL compiler environment switch "-env generic" is
224: not supported in this version. When your target operating
225: system is the same as the development environment, you do
226: not have to specify an environment switch; the default
227: settings are correct. Otherwise, use the specific
228: environment switch that corresponds to your target
229: application environment: "-env win32", "-env win16", or
230: "-env dos".
231:
232: 5.0 Cast char constants as small in OSF compatibility mode
233:
234: The MIDL compiler expects char constants to be type
235: small. The following definition generates a type mismatch
236: error message:
237:
238: const char c = 'a'; // fails with type mismatch error
239:
240: Use the following statement to avoid the error:
241:
242: const char c = (small) 'a';
243:
244: This temporary solution applies only to this release of
245: Microsoft RPC version 1.0 and will generate errors in OSF
246: versions of the IDL compiler and in future releases of the
247: MIDL compiler.
248:
249: 6.0 MIDL type "wchar_t" not supported in all modes
250:
251: The extended character type wchar_t is not fully supported
252: in this release of Microsoft RPC version 1.0.
253:
254: The wchar_t type is supported in the following modes:
255:
256: implicit_local
257: app_config
258: ms_ext
259: (ms_ext + implicit_local)
260:
261: The wchar_t type is not supported in the following modes:
262:
263: OSF compatibility mode (no switches)
264: (implicit_local + app_config)
265: (ms_ext + app_config)
266: (ms_ext + app_config + implicit_local)
267:
268: 7.0 MIDL attribute pointer_default() not OSF compatible
269:
270: The pointer_default() attribute in this release of Microsoft
271: RPC version 1.0 is not completely compatible with the DCE
272: implementation. For example, in the Microsoft
273: implementation, the following function parameter is a
274: reference pointer:
275:
276: pointer_default(ptr);
277: ...
278: typedef x * MY_POINTER_TYPE;
279: ...
280: Foo(MY_POINTER_TYPE px);
281:
282: The DCE implementation treats px as a full pointer in the
283: above example.
284:
285: 8.0 MIDL interprets "handle" in attribute list as keyword
286:
287: The MIDL compiler supplied with this release of Microsoft
288: RPC version 1.0 interprets the token "handle" as a keyword
289: in the context of an attribute list. For example, consider
290: an IDL file that contains the following implicit handle
291: declaration:
292:
293: [implicit_handle (handle_t handle)]
294:
295: Because the MIDL compiler interprets the name "handle" as a
296: keyword rather than as a variable name, MIDL returns an
297: error code indicating that the "handle" keyword is used
298: incorrectly in the above example.
299:
300: C keywords such as "auto", "static", and "extern" generate
301: similar errors during MIDL compilation. Do not use MIDL or C
302: keywords as variable names.
303:
304: 9.0 C Stub Source Code Causes Compilation Warnings
305:
306: The stub files generated by the MIDL compiler may generate
307: warnings when they are compiled at compiler warning level 3
308: and higher. These warnings can generally be safely ignored.
309:
310: Unsigned character string arguments generate "incompatible
311: pointer assignment warnings" when you compile the stubs. The
312: C run-time library functions use char * arguments rather
313: than unsigned char * arguments. Compiler warning messages
314: about mismatched comparisons between integral types and
315: mismatched pointer assignments in stubs can be safely
316: ignored.
317:
318: 10.0 Use tagged structure declarations
319:
320: The MIDL compiler assigns temporary tags to untagged
321: structures. When you use more than one IDL file to build
322: your distributed application, the MIDL compiler may assign
323: the same temporary name to both untagged structures and fail
324: to link.
325:
326: You can avoid these link errors by specifying using tagged
327: structure declarations for types imported or shared between
328: interfaces.
329:
330: For example, the following untagged structure
331: UNTAGGED_STRUCT can be changed to the tagged structure
332: TAGGED_STRUCT:
333:
334: typedef struct {
335: char * pszName;
336: char * pszAddress;
337: } UNTAGGED_STRUCT;
338:
339: typedef struct _TAGGED_STRUCT {
340: char * pszName;
341: char * pszAddress;
342: } TAGGED_STRUCT;
343:
344: 11.0 Unsized arrays not supported
345:
346: This release of Microsoft RPC version 1.0 does not support
347: character arrays that are specified without the array size.
348: Specify the array size or use a character pointer.
349:
350: For example, the following function argument is not
351: supported:
352:
353: foo ([in, string] char ac[]);
354:
355: Use char pointers or specify the array size. The following
356: function arguments are supported:
357:
358: foo([in, string] char char_array[100]);
359:
360: foo([in, string] char * char_array);
361:
362: 12.0 Updated command line help for the MIDL compiler
363:
364: The updated help text for the MIDL compiler appears as
365: follows:
366:
367: -MIDL COMPILER OPTIONS-
368: -MODE-
369: /ms_ext Microsoft extensions mode
370: /app_config Application configuration mode
371: /implicit_local Assume non-remote data is [local]
372:
373: -INPUT-
374: /acf filename Specify the attribute configuration file
375: /I directory Specify directory for import and include files
376: /import ms_ext Compile only needed portions of imported IDL files
377: /import ms_nt Compile only needed portions of imported IDL files
378: /import osf Assume imported IDL files are compiled separately
379: /no_def_idir Ignore the current and the INCLUDE directories
380:
381: -OUTPUT FILE GENERATION-
382: /client all Generate client stub and aux files
383: /client aux Generate client auxiliary file only
384: /client none Generate no client files
385: /client stub Generate client stub file only
386: /out directory Destination directory for output files
387: /server all Generate server stub and aux files
388: /server aux Generate server aux file only
389: /server none Generate no server files
390: /server stub Generate server stub file only
391: /syntax_check Check syntax only; do not generate output files
392: /Zs Check syntax only; do not generate output files
393:
394: -OUTPUT FILE NAMES-
395: /caux filename Specify client auxiliary file name
396: /cstub filename Specify client stub file name
397: /cswtch filename Specify switch stub file name
398: /Fs filename Generate a listing file
399: /header filename Specify header file name
400: /saux filename Specify server auxiliary file name
401: /sstub filename Specify server stub file name
402:
403: -C COMPILER AND PREPROCESSOR OPTIONS-
404: /cc_cmd cmd_line Specify C compiler for stub, aux files
405: /cc_opt options Specify options associated with C compiler
406: /cpp_cmd cmd_line Specify name of C preprocessor
407: /cpp_opt options Specify additional C preprocessor
408: options
409: /D name[=def] Pass #define name, optional value to C preprocessor
410: /no_cpp Turn off the C preprocessing option
411: /U name Remove any previous definition (undefine)
412:
413: -ENVIRONMENT-
414: /char signed C compiler default char is signed
415: /char unsigned C compiler default char is unsigned
416: /char ansi7 Char values limited to 0-127
417: /env dos MS-DOS client
418: /env win16 Microsoft Windows 16-bit (Win 3.x)
419: /env win32 Microsoft Windows 32-bit (NT)
420: /env generic Produce one header for all environments
421:
422: -ERROR AND WARNING MESSAGES-
423: /error all Check for all types of errors
424: /error allocation Check for out of memory errors
425: /error enum Check for errors converting long, short enum
426: /error trees Check for aliasing errors only
427: /no_warn Suppress compiler warning messages
428:
429: -OPTIMIZATION-
430: /pack {1|2|4|8} Designate packing level of structures
431: /space_opt Optimize code for space rather than speed
432: /Zp{1|2|4|8} Designate packing level of structures
433:
434: -MISCELLANEOUS-
435: /? List MIDL compiler switch settings
436: @response_file Accept input from a response file
437: /confirm Display options without compiling MIDL source
438: /help Display a list of MIDL compiler switches
439: /prefix "s1" "s2" Replace default suffix "s1" with prefix "s2"
440:
441: 13.0 RpcBindingToStringBinding does not return network address
442:
443: The RPC API function RpcBindingToStringBinding, when used
444: with the named pipe loadable transport, does not return the
445: network address.
446:
447: Use the function RpcStringBindingParse to obtain the other
448: components of the binding string, use the Win32 function
449: GetComputerName to obtain the computer name that represents
450: the network address, then call RpcStringBindingCompose to
451: reconstruct the correct string binding from these
452: components.
453:
454: 14.0 RpcServerUseAllProtseqs, RpcNetworkInqProtseqs Incomplete
455:
456: The RPC API functions RpcNetworkInqProtseqs and
457: RpcServerUseAllProtseqs return status codes that indicate
458: success but the functions do not operate properly.
459:
460: RpcNetworkInqProtseqs returns a RPC_PROTSEQ_VECTOR data
461: structure with a count value of 0 and no pointers to
462: protocol sequence strings.
463:
464: Rather than call RpcServerUseAllProtseqs, call
465: RpcServerUseProtseq for each supported protocol sequence:
466:
467: RPC_STATUS RpcStatus;
468:
469: RpcStatus = RpcServerUseProtseq("ncacn_np",
470: MaxCalls, SecurityDescriptor);
471: ...
472: RpcStatus = RpcServerUseProtseq("ncacn_ip_tcp",
473: MaxCalls, SecurityDescriptor);
474: ...
475: RpcStatus = RpcServerUseProtseq("ncacn_dnet_nsp",
476: MaxCalls, SecurityDescriptor);
477: ...
478: RpcStatus = RpcServerUseProtseq("ncacn_nb_nb",
479: MaxCalls, SecurityDescriptor);
480: ...
481: RpcStatus = RpcServerUseProtseq("ncalrpc",
482: MaxCalls, SecurityDescriptor);
483:
484: 15.0 DCE error codes not mapped to Win32 error codes
485:
486: In this release of Microsoft RPC version 1.0, the run-time
487: API functions RpcEp* return DCE error codes rather than the
488: documented Win32 error codes. The DCE error codes, RPC error
489: manifest, and Win32 error codes are as follows:
490:
491: Win32 error code RPC Manifest DCE error code
492:
493: 1751 EPT_S_INVALID_ENTRY 0x1c110007
494: 1752 EPT_S_CANT_PERFORM_OP 0x1c110001
495: 1753 EPT_S_NOT_REGISTERED 0x1c110004
496:
497: The RPC header files define the manifests to the Win32 error
498: code values but the RPC runtime functions return the DCE
499: values. Redefine the manifests in your application to the
500: DCE values, as follows:
501:
502: #undef EPT_S_CANT_PERFORM_OP
503: #define EPT_S_CANT_PERFORM_OP 0x1c110001
504: #undef EPT_S_INVALID_ENTRY
505: #define EPT_S_INVALID_ENTRY 0x1c110007
506: #undef EPT_S_NOT_REGISTERED
507: #define EPT_S_NOT_REGISTERED 0x1c110004
508:
509: 16.0 Using the MS-DOS UuidGen utility with Microsoft Windows NT
510:
511: The UuidGen utility is supplied for MS-DOS only. No version
512: is supplied for native Microsoft Windows NT. However, you
513: can run the MS-DOS version of this utility in the Microsoft
514: Windows NT MS-DOS screen group. The utility is available in
515: compressed format in the MSTOOLS\RPC_DOS directory. To
516: decompress the UuidGen utility, use the following command on
517: Microsoft Windows 3.x:
518:
519: setup /z uuidgen.ex_ drive:\directory\uuidgen.exe
520:
521: where drive: and directory specify a directory on your path.
522:
523: 17.0 Creating installation disks for your application
524:
525: Two batch files help you create RPC run-time installation
526: disks that can accompany your distributed application. These
527: batch files create installation disks that contain the Setup
528: program and the Microsoft RPC run-time libraries, allowing
529: you to distribute the Microsoft RPC run-time libraries with
530: your distributed application. The following two batch files
531: are provided:
532:
533: wrundisk.bat creates Microsoft Windows/MS-DOS run-time
534: install disk
535: drundisk.bat creates MS-DOS-only run-time install disk
536:
537: 17.1 Creating installation disks for Microsoft Windows applications
538:
539: Insert a formatted, blank floppy disk in the destination
540: drive. Start the installation disk utility by typing
541: "wrundisk" followed by the optional source and destination
542: drive names. The wrundisk.bat file uses the following
543: syntax:
544:
545: wrundisk [source:[path] [dest:]]
546:
547: where
548:
549: source is a disk or directory that contains the compressed
550: files that are provided in the Microsoft Windows NT SDK
551: directory \mstools\rpc_dos\disk1.
552:
553: dest is a drive name specifying the drive that contains the
554: formatted, blank floppy disk.
555:
556: For example,"wrundisk c:\nt\mstools\rpc_dos\disk1 a:" copies
557: the compressed files to the floppy disk in the drive A.
558:
559: Your application user can then use the Setup program under
560: Microsoft Windows on the resulting installation disk to
561: install the RPC run-time libraries for Microsoft Windows and
562: MS-DOS.
563:
564: 17.2 Installation disks for MS-DOS Distributed Applications
565:
566: The drundisk utility copies files from an installed RPC SDK.
567: To ensure that all MS-DOS loadable transports are present on
568: the run-time installation disk, you must select all loadable
569: transports at the time you install the Microsoft RPC SDK.
570:
571: Insert a formatted, blank floppy disk in the destination
572: drive. Start the installation utility by typing "drundisk"
573: followed by the optional source and destination drive names.
574: The drundisk.bat file uses the following syntax:
575:
576: drundisk [directory [dest:]]
577:
578: where directory is the name of the directory that contains
579: all loadable transport (.RPC) files and all name service
580: dynamic link libraries.
581:
582: For example, the command "drundisk c:\lanman.dos\netprog a:"
583: copies the MS-DOS run-time libraries, the loadable transport
584: files, and name service DLLs from the C hard drive to the
585: floppy disk in drive A. Your application user can then use
586: the Setup program on the run-time installation disk to
587: install the RPC run-time libraries.
588:
589: 18.0 New LAN Manager 2.1 DLL required for Windows clients
590:
591: Install an updated version of the dynamic link library
592: NETAPI.DLL for Microsoft Windows 3.x clients that use
593: Microsoft LAN Manager 2.1 named pipes. This version of the
594: LAN Manager API library corrects a software error.
595:
596: To install the new version of this library, connect to the
597: directory that contains the Setup program and the compressed
598: source files, then enter the command:
599:
600: setup /z netapi.dl_ drive:\directory\netapi.dll
601:
602: where drive and directory specify the path to the LAN
603: Manager 2.1 directory that contains NETAPI.DLL. For example,
604: if LAN Manager is installed in the directory C:\LANMAN.DOS,
605: use the command:
606:
607: setup /z netapi.dl_ c:\lanman.dos\netprog\netapi.dll
608:
609: 19.0 Running the locator and endpoint mapper
610:
611: In this release of Microsoft RPC version 1.0, the locator
612: and endpoint mapper are not provided as services but as
613: programs that you must start from the Microsoft Windows NT
614: command line. The locator is the Microsoft implementation of
615: the RPC name service independent API functions (NSI). The
616: endpoint mapper allows the use of dynamic endpoints.
617:
618: Start the locator using the following command syntax:
619:
620: locator /noservice
621:
622: Start the endpoint mapper on the RPC server using the
623: following syntax:
624:
625: rpcss noservice
626:
627: Start the locator and endpoint mapper before starting the
628: server application. In this release of Microsoft RPC version
629: 1.0, distributed applications that use the RPC NSI API
630: functions must run the server and client applications on the
631: same computer.
632:
633: 20.0 Updating RPC registry entries for new NetBIOS configurations
634:
635: The Microsoft RPC Setup program automatically maps protocol
636: strings to NetBIOS lana numbers and writes these settings in
637: the registry. These mappings work as long as you only have
638: one network card and one network protocol. If this is not
639: the case, or if you change your network configuration after
640: installing Microsoft RPC, you must update the registry to
641: indicate the new correspondences between protocol strings
642: and NetBIOS lana numbers.
643:
644: For Microsoft Windows NT, the mapping string appears in the
645: registry tree under \Software\Microsoft\Rpc\NetBios. For
646: MS-DOS, the mapping string appears in the registry file
647: RPCREG.DAT.
648:
649: The mapping string uses the following syntax:
650:
651: ncacn_nb_<protocol><digit> = <lana_number>
652:
653: where
654:
655: <protocol> indicates the protocol type. For MS-DOS, the
656: valid <protocol> value is "nb". For Microsoft Windows NT,
657: valid <protocol> values are as follows:
658:
659: <protocol> Protocol type
660:
661: xns XNS
662: nb NetBEUI
663: tcpip TCP/IP
664:
665: <digit> indicates a unique digit associated with each
666: instance of a protocol. Use the value 0 for the first
667: instance of a protocol and use the next consecutive digit
668: for each additional instance of that protocol. For example,
669: assign the value ncacn_nb_nb0 to the first NetBEUI entry;
670: assign the value ncacn_nb_nb1 to the second NetBEUI entry.
671:
672: <lana_number> indicates the NetBIOS lana number. A unique
673: lana number is associated with each network adapter present
674: in the computer. For more information about the lana number,
675: see your network documentation.
676:
677: For example, the following mapping string describes a
678: configuration that uses the NetBEUI protocol over an adapter
679: card that is assigned lana number 0:
680:
681: ncacn_nb_nb0=0
682:
683: When you install a second card that supports both XNS and
684: NetBEUI protocols, the mapping strings appear as follows:
685:
686: ncacn_nb_nb0=0
687: ncacn_nb_nb1=1
688: ncacn_nb_xns0=2
689:
690: 21.0 RPC application exception handling for Microsoft Windows 3.x
691:
692: A software error in this release of Microsoft RPC version
693: 1.0 can cause your Microsoft Windows 3.x RPC application to
694: GP fault after repeated exceptions and repeated execution of
695: the application.
696:
697: When the top-level exception handler exits with an
698: exception, an internal data structure is left in an
699: incorrect state. Repeated execution of the same application
700: can then cause memory corruption.
701:
702: You can avoid this error by guaranteeing that the final top-
703: level try block of the program is exited normally (without
704: an exception). Use the following structure in your
705: application:
706:
707: RpcTryExcept
708: {
709: ...
710: }
711: RpcExcept(...)
712: {
713: ...
714: }
715: /* add a try-finally block here */
716: volatile x = 1; /* assure this code is present */
717: RpcTryFinally
718: {
719: if (x == 2)
720: x++;
721: }
722: RpcFinally
723: {
724: x = 3;
725: }
726: RpcEndFinally;
727: RpcEndExcept
728:
729: The volatile variable x does not perform any useful function
730: for the application. It is present only to ensure that the
731: RpcTryFinally structure is present after the C compiler
732: optimizes the application.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.