|
|
1.1 ! root 1: LANGREAD.TXT File ! 2: README file for Microsoft(R) Windows NT(TM) SDK (BETA) ! 3: Development Tools ! 4: (C) Copyright Microsoft Corporation, 1992 ! 5: ! 6: This document contains release notes for the developent tools, C/C++ ! 7: language, and libraries provided with the Microsoft(R) Windows NT(TM) ! 8: Software Development Kit (BETA). The information in this file is newer, ! 9: and therefore supersedes any similar information in the printed ! 10: manuals. ! 11: ! 12: ! 13: ================================< Contents >================================ ! 14: ! 15: ! 16: This file has six parts: ! 17: ! 18: Part Title ! 19: ---- ----- ! 20: 1 Additional 32-bit Run-time Functions: ! 21: _find Functions ! 22: _seterrormode ! 23: _loaddll ! 24: _unloaddll ! 25: _getdllprocaddr ! 26: _getdiskfree ! 27: _sleep ! 28: _beep ! 29: _getsystime ! 30: _setsystime ! 31: _futime ! 32: _getdrives ! 33: _get_osfhandle ! 34: _open_osfhandle ! 35: ! 36: 2 Further note on the _beginthread function ! 37: ! 38: 3 Notes on "C Language Reference" ! 39: ! 40: 4 Linker Options ! 41: ! 42: 5 Building Multithreaded Applications and DLLs ! 43: ! 44: 6 The WinDebug Graphical Debugger ! 45: ! 46: ===============< Part 1: Additional 32-bit Run-time Functions >========= ! 47: ! 48: In addition to the 32-bit C run-time functions listed in the appendix ! 49: to the Programming Techniques manual, the following routines are ! 50: specific to 32-bit operating systems: ! 51: ! 52: _find Functions ! 53: *************** ! 54: ! 55: Description ! 56: =========== ! 57: Find the first matching file, find the next matching file, or release ! 58: resources from previous find operations. ! 59: ! 60: #include <io.h> ! 61: ! 62: long _findfirst( char *filespec, struct _finddata_t *fileinfo ); ! 63: int _findnext( long handle, struct _finddata_t *fileinfo ); ! 64: int _findclose( long handle ); ! 65: ! 66: filespec Target file specification (may include ! 67: wildcards) ! 68: handle Search handle returned by a previous call to ! 69: _findfirst ! 70: fileinfo File information buffer ! 71: ! 72: Remarks ! 73: ======= ! 74: The _findfirst routine returns information about the first instance of ! 75: a file whose name matches the filename argument. The filename argument ! 76: may use wildcards (* and ?). Any wildcard combination supported by the ! 77: host operating system may be used. ! 78: ! 79: Information is returned in a _finddata_t structure, defined in IO.H. ! 80: The _finddata_t structure contains the following elements: ! 81: ! 82: Element Description ! 83: ------- ----------- ! 84: unsigned attrib File attribute ! 85: ! 86: time_t time_create Time of file creation (-1 for FAT file ! 87: systems) ! 88: ! 89: time_t time_access Time of last file access (-1 for FAT file ! 90: systems) ! 91: ! 92: time_t time_write Time of last write to file ! 93: ! 94: _fsize_t size Length of file in bytes ! 95: ! 96: char name[_MAX_FNAME] Null-terminated name of matched ! 97: file/directory, without the path ! 98: ! 99: _MAX_FNAME is defined in STDLIB.H. ! 100: ! 101: Unlike its MS-DOS counterpart, _findfirst does not allow the programmer ! 102: to specify target attributes (_A_RDONLY, etc.) by which to limit the ! 103: find operation. This attribute is returned in the attrib field of the ! 104: _finddata_t structure and can have the following values (defined in ! 105: IO.H): ! 106: ! 107: Constant Meaning Value ! 108: -------- ------- ----- ! 109: _A_ARCH Archive. Set whenever the file 0x20 ! 110: is changed, and cleared by the ! 111: MS-DOS BACKUP command. ! 112: ! 113: _A_HIDDEN Hidden file. Cannot be found 0x02 ! 114: with the MS-DOS DIR command. Returns ! 115: information about normal files as well ! 116: as about files with this attribute. ! 117: ! 118: _A_NORMAL Normal. File can be read or written 0x00 ! 119: without restriction. ! 120: ! 121: _A_RDONLY Read-only. File cannot be opened for 0x01 ! 122: writing, and a file with the same name ! 123: cannot be created. Returns information ! 124: about normal files as well as about ! 125: files with this attribute. ! 126: ! 127: _A_SUBDIR Subdirectory. Returns information about 0x10 ! 128: normal files as well as about files ! 129: with this attribute. ! 130: ! 131: _A_SYSTEM System file. Cannot be found with the 0x04 ! 132: MS-DOS DIR command. Returns information ! 133: about normal files as well as about ! 134: files with this attribute. ! 135: ! 136: The _findnext routine finds the next name, if any, that matches the ! 137: filespec argument specified in a prior call to _findfirst. The fileinfo ! 138: argument should point to a structure initialized by a previous call to ! 139: _findfirst. The contents of the structure will be altered as described ! 140: above if a match is found. ! 141: ! 142: The _findclose routine closes the specified search handle and releases ! 143: associated resources. ! 144: ! 145: The _find functions allow nested calls. For example, if the file found ! 146: by a call to _findfirst or _findnext is a subdirectory, a new search ! 147: can then be initiated with another call to _findfirst or _findnext. ! 148: ! 149: Return Value ! 150: ============ ! 151: If successful, the _findfirst function returns a unique search handle ! 152: identifying the file or group of files matching the filespec ! 153: specification which can be used in a subsequent call to _findnext or ! 154: _findclose. Otherwise, it returns -1 and sets errno to one of the ! 155: following values: ! 156: ! 157: Value Description ! 158: ----- ----------- ! 159: ENOENT filespec could not be matched ! 160: ! 161: EINVAL Illegal filename specification ! 162: ! 163: If successful, the _findnext and _findclose functions return 0. ! 164: Otherwise, they return -1 and set errno to ENOENT, indicating that no ! 165: more matching files could be found. Although each search operation ! 166: returns its own unique handle, the same ! 167: ! 168: _seterrormode ! 169: ************* ! 170: ! 171: Description ! 172: =========== ! 173: Controls whether the operating system handles hard errors or allows the ! 174: calling application to handle them. ! 175: ! 176: #include <stdlib.h> ! 177: ! 178: void _seterrormode( int mode ); ! 179: ! 180: mode Error mode ! 181: ! 182: Remarks ! 183: ======= ! 184: The mode argument specifies the error-mode flag. If mode is set to ! 185: _CRIT_ERROR_PROMPT, The system displays an error message prompt ! 186: indicating that a hard error has occurred. If mode is set to ! 187: _CRIT_ERROR_FAIL, the system returns the failed call to the calling ! 188: application with an error indicating the cause. ! 189: ! 190: Return Value ! 191: ============ ! 192: None. ! 193: ! 194: _loaddll ! 195: ******** ! 196: ! 197: Description ! 198: =========== ! 199: Loads the specified DLL into memory. ! 200: ! 201: #include <process.h> ! 202: ! 203: int _loaddll( char *dllname ); ! 204: ! 205: dllname Null-terminated string that names the DLL to ! 206: be loaded. ! 207: ! 208: Remarks ! 209: ======= ! 210: The _loaddll routine loads the specified Dynamic Link Library. If the ! 211: dllname argument does not include a fully-qualified path name, the ! 212: library is searched for according to the search path specified by the ! 213: host operating system. ! 214: ! 215: Return Value ! 216: ============ ! 217: If successful, the _loaddll routine returns a unique handle to the DLL. ! 218: Otherwise, it returns 0. ! 219: ! 220: _unloaddll ! 221: ********** ! 222: ! 223: Description ! 224: =========== ! 225: Unloads the specified DLL from the current process. ! 226: ! 227: #include <process.h> ! 228: ! 229: int _unloaddll( int handle ); ! 230: ! 231: handle Handle to the loaded DLL, from a previous call ! 232: to _loaddll. ! 233: ! 234: Remarks ! 235: ======= ! 236: The _unloaddll routine unloads the specified DLL. The DLL�s resources ! 237: may be freed if no other processes are using it. ! 238: ! 239: Return Value ! 240: ============ ! 241: If successful, the _unloaddll routine returns 0. Otherwise, it returns ! 242: an operating system error code. ! 243: ! 244: _getdllprocaddr ! 245: *************** ! 246: ! 247: Description ! 248: =========== ! 249: Returns the address of the specified exported DLL function. ! 250: ! 251: #include <process.h> ! 252: ! 253: int (* _getdllprocaddr(int handle, char *procname, int ordinal))(); ! 254: ! 255: handle Handle to DLL module that contains the function ! 256: (returned by previous call to _loaddll) ! 257: ! 258: procname Pointer to null-terminated string containing ! 259: the function name, or NULL if the function's ! 260: ordinal value is to be used. ! 261: ! 262: ordinal Function's ordinal value, or -1 if the ! 263: function's name is to be used. ! 264: ! 265: Remarks ! 266: ======= ! 267: The _getdllprocaddr routine retrieves the address of exported ! 268: functions in DLLs. The function can be specified by name or by ordinal ! 269: value. The retrieved address can then be called as a function pointer. ! 270: ! 271: Return Value ! 272: ============ ! 273: If successful, the _getdllprocaddr function returns a pointer to the ! 274: function's entry point. Otherwise, it returns NULL. ! 275: ! 276: _getdiskfree ! 277: ************ ! 278: ! 279: Description ! 280: =========== ! 281: Retrieves information about the current or specified disk drive, ! 282: including the amount of free space on the disk. ! 283: ! 284: include <direct.h> ! 285: include <dos.h> ! 286: ! 287: int _getdiskfree( unsigned drive, struct _diskfree_t diskinfo ); ! 288: ! 289: drive Specified drive number. This argument is 0 for ! 290: the current drive, or 1-26 for another ! 291: specified disk drive. ! 292: ! 293: diskinfo Disk information structure ! 294: ! 295: Remarks ! 296: ======= ! 297: The _getdiskfree function retrieves information about the specified ! 298: disk drive. This information is returned in a _diskfree_t structure, ! 299: which is defined in DIRECT.H and has the following fields: ! 300: ! 301: Element Description ! 302: ------- ----------- ! 303: unsigned total_clusters Total number of clusters on the disk ! 304: ! 305: unsigned avail_clusters Total number of free clusters on the disk ! 306: ! 307: unsigned sectors_per_cluster Number of sectors per cluster ! 308: ! 309: unsigned bytes_per_sector Number of bytes per sector ! 310: ! 311: Return Value ! 312: ============ ! 313: If successful, the _getdiskfree routine returns 0. Otherwise, it ! 314: returns an operating system error code. ! 315: ! 316: _sleep ! 317: ****** ! 318: ! 319: Description ! 320: =========== ! 321: Delays execution of the current thread or process for a specified ! 322: interval. ! 323: ! 324: include <stdlib.h> ! 325: ! 326: void _sleep( unsigned long duration ); ! 327: ! 328: duration Specifies the relative time, in milliseconds, ! 329: that the delay is to occur. ! 330: ! 331: Remarks ! 332: ======= ! 333: In multithreaded operating systems, the _sleep routine causes the ! 334: current thread to enter a waiting state until the specified interval of ! 335: time has passed. In single- threaded operating systems, the _sleep ! 336: routine causes the current process to be delayed. During the delay, ! 337: other threads or processes can continue execution. With MS-DOS, yield ! 338: messages are sent periodically which can be handled by Windows or other ! 339: multitasking operating systems. ! 340: ! 341: The duration argument indicates the length of the interval in ! 342: milliseconds. It can also be one of the following two values: ! 343: ! 344: Constant Value ! 345: -------- ----- ! 346: _SLEEP_MINIMUM Function returns immediately ! 347: ! 348: _SLEEP_FOREVER Infinite delay ! 349: ! 350: Note that in non-preemptive multitasking operating systems (such as ! 351: Windows), the duration may be longer than specified, since other ! 352: processes may not return control at the end of the delay. ! 353: ! 354: Return Value ! 355: ============ ! 356: None. ! 357: ! 358: _beep ! 359: ***** ! 360: ! 361: Description ! 362: =========== ! 363: Generates simple tones on the speaker. ! 364: ! 365: #include <stdlib.h> ! 366: ! 367: void _beep( unsigned frequency, unsigned duration ); ! 368: ! 369: frequency Specifies the frequency of the sound in hertz. ! 370: Audible sounds will be generated by frequencies ! 371: between 37 (25 hex) and 32767 (07FFF hex). ! 372: ! 373: duration Specifies the duration of the sound in ! 374: milliseconds. See the description of the _sleep ! 375: function for possible values. Note that in ! 376: non-preemptive multitasking operating systems ! 377: (such as Windows), the duration may be longer ! 378: than specified, since other processes may not ! 379: return control at the end of the delay. ! 380: ! 381: Return Value ! 382: ============ ! 383: None. ! 384: ! 385: _getsystime ! 386: *********** ! 387: ! 388: Description ! 389: =========== ! 390: Retrieves the current system time. ! 391: ! 392: #include <time.h> ! 393: ! 394: unsigned _getsystime( struct tm *tmstruct ); ! 395: ! 396: tmstruct Pointer to a tm time structure containing ! 397: information about the system date and time. ! 398: ! 399: Remarks ! 400: ======= ! 401: The _getsystime routine fills in a tm time structure (defined in ! 402: TIME.H) with information about the system date and time. The routine ! 403: then returns the fractional portion of the nearest second, in ! 404: milliseconds. ! 405: ! 406: Return Value ! 407: ============ ! 408: The _getsystime function returns the fractional portion of the nearest ! 409: second, in milliseconds. ! 410: ! 411: _setsystime ! 412: *********** ! 413: ! 414: Description ! 415: =========== ! 416: Sets the current system time. ! 417: ! 418: #include <time.h> ! 419: ! 420: unsigned _setsystime( struct tm *tmstruct, unsigned milliseconds ); ! 421: ! 422: tmstruct Pointer to a tm time structure containing ! 423: information about the system date and time ! 424: ! 425: milliseconds Fractional portion of nearest second, in ! 426: milliseconds ! 427: ! 428: Remarks ! 429: ======= ! 430: The _setsystime routine sets the current system time to the specified ! 431: time. ! 432: ! 433: Return Value ! 434: ============ ! 435: If successful, the _setsystime routine returns 0. Otherwise, it ! 436: returns an operating system error code. ! 437: ! 438: _futime ! 439: ******* ! 440: ! 441: Description ! 442: =========== ! 443: Sets the modification time on an open file. ! 444: ! 445: #include <\sys\utime.h> ! 446: ! 447: int _futime( int handle, struct _utimbuf *filetime ); ! 448: ! 449: handle Handle to open file ! 450: ! 451: filetime Pointer to structure containing new ! 452: modification date ! 453: ! 454: Remarks ! 455: ======= ! 456: The _futime routine sets the modification date on the open file ! 457: associated with handle. It is identical to the _utime function, except ! 458: that its argument is the handle to an open file, rather than the name ! 459: of a file or a path to a file. Although the _utimbuf structure contains ! 460: a field for access time, only the modification time is set with systems ! 461: that do not support access time (such as MS- DOS). ! 462: ! 463: Return Value ! 464: ============ ! 465: The _futime function returns 0 if successful. A return value of -1 ! 466: indicates an error; in this case, errno is set to EBADF, indicating an ! 467: invalid file handle. ! 468: ! 469: _getdrives ! 470: ********** ! 471: ! 472: Description ! 473: =========== ! 474: Returns a bitmask representing the currently available disk drives. ! 475: ! 476: #include <direct.h> ! 477: ! 478: unsigned long _getdrives ( void ); ! 479: ! 480: Return Value ! 481: ============ ! 482: The return value is a bit map with bits set for each currently ! 483: available disk drive. Bit position 0 (the least-significant bit) is ! 484: drive A, bit position 1 is drive B, bit position 2 is drive C, and so ! 485: on. ! 486: ! 487: _get_osfhandle ! 488: ************** ! 489: ! 490: Description ! 491: =========== ! 492: Associates an operating system file handle with an existing C run-time ! 493: file handle. ! 494: ! 495: #include <io.h> ! 496: ! 497: long _get_osfhandle( int filehandle ); ! 498: ! 499: filehandle User file handle ! 500: ! 501: Return Value ! 502: ============ ! 503: If successful, the _get_osfhandle routine returns an operating system ! 504: file handle, corresponding to filehandle. Otherwise, it returns -1 and ! 505: sets errno to EBADF, indicating an invalid file handle. ! 506: ! 507: _open_osfhandle ! 508: *************** ! 509: ! 510: Description ! 511: =========== ! 512: Associates a C run-time file handle with an existing operating system ! 513: file handle. ! 514: ! 515: #include <io.h> ! 516: ! 517: int _open_osfhandle( long osfhandle, int flags ); ! 518: ! 519: osfhandle Operating system file handle ! 520: ! 521: flags Type of operations allowed ! 522: ! 523: Remarks ! 524: ======= ! 525: The _open_osfhandle routine allocates a C run-time file handle and ! 526: sets it to point to the operating system file handle specified by ! 527: osfhandle. The flags argument is an integer expression formed from one ! 528: or more of the manifest constants defined in FCNTL.H and listed below. ! 529: When two or more manifest constants are used to form the flags ! 530: argument, the constants are combined with the bitwise-OR operator (|). ! 531: ! 532: The FCNTL.H file defines the following manifest constants: ! 533: ! 534: Constant Meaning ! 535: -------- ------- ! 536: _O_APPEND Repositions the file pointer to the end of the ! 537: file before every write operation. ! 538: ! 539: _O_RDONLY Opens file for reading only. ! 540: ! 541: _O_TEXT Opens file in text (translated) mode. ! 542: ! 543: Return Value ! 544: ============ ! 545: If successful, the _open_osfhandle function returns a C run-time file ! 546: handle. Otherwise, it returns -1. ! 547: ! 548: ! 549: =============< Part 2: Further note on the _beginthread function >============== ! 550: ! 551: Windows NT handles the allocation of the stack when the _beginthread ! 552: routine is called. Therefore, unlike previous 16-bit versions of the ! 553: function, the programmer does not need to pass the address of the ! 554: thread stack to _beginthread. The following description supersedes the ! 555: information in the appendix to the Programming Techniques manual: ! 556: ! 557: unsigned long _beginthread( void( *start_address )( void * ), unsigned ! 558: stack_size, void *arglist ); ! 559: ! 560: start_address Starting address of thread ! 561: stack_size Stack size for thread ! 562: arglist Argument list for thread ! 563: ! 564: =====================< Part 3: C Language Reference >================================ ! 565: ! 566: The following information is 16- and 32-bit specific information that ! 567: supersedes the information listed on the corresponding pages of the ! 568: Microsoft C/C++ C Language Reference manual. ! 569: ! 570: Page 5 ! 571: The following keywords are not supported for 32-bit targets: __far, ! 572: __fortran, __huge, __interrupt, __loadds, __pascal, __saveregs, ! 573: __segment, __self. Limited 32-bit support is available for __based. The ! 574: __try, __except and __finally keywords are supported only for 32-bit ! 575: compilations. ! 576: ! 577: Page 13 ! 578: For 32-bit targets, the values of long double are the same as for double. ! 579: ! 580: Page 48 ! 581: The 32-bit compiler ignores the register keyword. ! 582: ! 583: Page 56 ! 584: The 32-bit compiler ignores the use of the __near keyword. ! 585: ! 586: Page 57 ! 587: The 32-bit compiler does not allow the use of the __far keyword. ! 588: ! 589: Page 57 ! 590: The 32-bit compiler does not allow the use of the __huge keyword. ! 591: ! 592: Page 57 ! 593: For 32-bit targets, __based specifies that a pointer is a 32-bit offset ! 594: from a 32-bit base. ! 595: ! 596: Page 57 ! 597: The __fortran and __pascal keywords are not accepted for 32-bit targets. ! 598: ! 599: Page 58 ! 600: The __cdecl calling convention is the default for 32-bit targets. ! 601: ! 602: Page 58 ! 603: The 32-bit compiler uses the ECX and EDX registers, but Microsoft ! 604: reserves the right to change the registers and implementation of the ! 605: __fastcall calling convention between releases of the compiler. ! 606: ! 607: Page 59 ! 608: The __segment keyword is not supported by the 32-bit compiler. ! 609: ! 610: Page 70 ! 611: The default packing size is 4 for 32-bit targets. ! 612: ! 613: Page 71 ! 614: Bit fields default to size long for the 32-bit compiler. ! 615: ! 616: Page 76 ! 617: For 32-bit targets, size_t is unsigned long and the __huge keyword is ! 618: not required. ! 619: ! 620: Page 80 ! 621: The __segment type and the built-in function __segname are not ! 622: supported by the 32-bit compiler. ! 623: ! 624: Page 82 ! 625: Pointers based on pointers are the only form of the __based keyword ! 626: valid in 32-bit compilations. In such compilations, they are 32-bit ! 627: displacements from a 32-bit base. ! 628: ! 629: Page 84 ! 630: Pointers based on __self are not available for 32-bit targets. ! 631: ! 632: Page 95 ! 633: On 32-bit computers, sizeof is unsigned long. ! 634: ! 635: Page 100 ! 636: The 32-bit compiler maps long double to type double. ! 637: ! 638: Page 121 ! 639: The base operator is not supported for 32-bit targets. ! 640: ! 641: Page 169 ! 642: The use of the __near keyword is ignored by the 32-bit compiler. ! 643: ! 644: Page 169 ! 645: The use of the __far keyword is illegal for 32-bit targets. ! 646: ! 647: Page 170 ! 648: The __fortran and __pascal keywords are illegal for 32-bit targets. ! 649: ! 650: Page 175 ! 651: For 16-bit targets, the __interrupt keyword specifies that the function ! 652: is an interrupt handler. The compiler generates appropriate entry and ! 653: exit sequences for the handling function, including saving and ! 654: restoring all registers and executing an IRET instruction to return. ! 655: Use this form to specify an interrupt function: ! 656: ! 657: __interrupt declarator ! 658: ! 659: where declarator is the name of the function to be called. An interrupt ! 660: function must be __far. If you are compiling with the small (default) ! 661: or compact memory model, you must explicitly declare the function with ! 662: the __far attribute. An interrupt function cannot be declared as an ! 663: inline function. ! 664: ! 665: Interrupt functions must observe the C calling convention. If you use ! 666: the /Gc compiler option (forcing the __pascal or __fortran calling ! 667: convention) or the /Gr compiler option (forcing the __fastcall calling ! 668: convention), you must explicitly declare your interrupt-handling ! 669: function with the __cdecl attribute. ! 670: ! 671: You cannot declare an interrupt function with both the __interrupt ! 672: attribute and the __saveregs attribute or the __fastcall calling ! 673: convention. ! 674: ! 675: This example statement declares a function pointer that can be used to ! 676: point to an interrupt handler: ! 677: ! 678: void ( __interrupt __far *oldtime ) ( void ); ! 679: ! 680: Page 175 ! 681: The __interrupt keyword is illegal in 32-bit targets. See Help for ! 682: more information on writing interrupt functions. ! 683: ! 684: Page 176 ! 685: The __loadds keyword is not supported in 32-bit targets. ! 686: ! 687: Page 176 ! 688: The __saveregs keyword is not supported in 32-bit targets. ! 689: ! 690: Page 199 ! 691: The following predefined macros are for 16-bit targets only: ! 692: ! 693: Identifier Function ! 694: ---------- -------- ! 695: _DLL Code for run-time library as a dynamic-link ! 696: library. Defined when /MD is specified. (For ! 697: 16-bit targets only.) ! 698: ! 699: _FAST Fast-compile. Defined when /f is specified ! 700: (the default). Supersedes _QC, which is still ! 701: supported but not recommended. Using /Od causes ! 702: CL to compile your program with /f. The /f ! 703: option compiles source files without any default ! 704: optimizations.(For 16-bit targets only.) ! 705: ! 706: M_I8086, _M_I8086 Defined for 8086 and 8088 processors (default ! 707: or /G0 option) (For 16-bit targets only.) ! 708: ! 709: M_I286, _M_I286 Defined for 80286 processor (/G1 or /G2 option). ! 710: (For 16-bit targets only.) ! 711: ! 712: M_I86mM, _M_I86mM Always defined. Identifies memory model, where ! 713: `m' is either T (tiny model), S (small model), ! 714: C (compact model), M (medium model), L (large ! 715: model), or H (huge model). Defined by /AT, /AS, ! 716: /AC, /AM, /AL and /AH, respectively. If huge ! 717: model is used, both M_I86LM and M_I86HM are ! 718: defined. Small model is the default. (For ! 719: 16-bit targets only.) ! 720: ! 721: _PCODE Defined for sections of code that are compiled ! 722: as pcode. Defined when /Oq is enabled. (For ! 723: 16-bit targets only.) ! 724: ! 725: _QC Supported for compatibility with Microsoft C ! 726: version 6.0. The _FAST macro (or /f) is the ! 727: default for C8 and is the recommended ! 728: alternative. (For 16-bit targets only.) ! 729: ! 730: _WINDLL Windows protected-mode dynamic-link library is ! 731: selected with /GD. (For 16-bit targets only.) ! 732: ! 733: _WINDOWS Windows protected mode is selected with /GA, ! 734: /Gn, /GW, /Mq, or /GD. (For 16-bit targets ! 735: only.) ! 736: ! 737: Page 199 ! 738: The following predefined macro is for 32-bit targets only: ! 739: ! 740: Identifier Function ! 741: ---------- -------- ! 742: _M_IX86 Defined as 300 for the 80386 processor (/G3 ! 743: option) and as 400 for the 80486 (/G4) processor. ! 744: ! 745: Page 210 ! 746: The following pragmas are for 16-bit targets only: ! 747: ! 748: #pragma check_pointer ([[{ on | off }]]) ! 749: ---------------------------------------- ! 750: Instructs the compiler to turn off pointer checking if off is ! 751: specified, or to turn on pointer checking if on is specified. If turned ! 752: on, this pragma causes the compiler to check every pointer dereference ! 753: to make sure the pointer is not a null or out- of-range pointer. The ! 754: check_pointer pragma is also enabled with the /Zr command-line option, ! 755: which is only available with the /f option. If you do not specify ! 756: either on or off, the effect of check_pointer is to reverse the ! 757: current state of pointer checking. If pointer checking is on, it is ! 758: turned off and vice versa. ! 759: ! 760: This pragma works function by function, not statement by statement. To ! 761: use this pragma, place a pair of check_pointer pragmas around any ! 762: function definition that contains pointer usage you want to check. ! 763: ! 764: #pragma code_seg ( [[ "segment-name" [[, "segment-class"]] ) ! 765: ------------------------------------------------------------ ! 766: Specifies a segment where functions are to be allocated, allowing the ! 767: use of based allocation without rewriting code. The code_seg pragma ! 768: specifies the default segment for functions. This is equivalent to ! 769: using the /NT (name of TEXT segment) compilation option. It is also ! 770: equivalent to specifying functions as based. You can, optionally, ! 771: specify the class as well as the segment name. For example: ! 772: ! 773: #pragma code_seg( "MY_CODE", "CODE" ) ! 774: ! 775: The preceding example causes functions following to be allocated in a ! 776: segment called MY_CODE. The segment is given a CODE class. ! 777: ! 778: Specifying the code_seg pragma with no arguments causes the compiler ! 779: to allocate all following functions in the default code segment called ! 780: MY_CODE. The segment is given a CODE class. ! 781: ! 782: Note ! 783: ---- ! 784: There is no way to specify the segment class using based function ! 785: allocation or the /NT compilation option. ! 786: ! 787: Functions allocated using the /NT option or code_seg pragma do not ! 788: retain any information about their location. However, functions ! 789: allocated using the based function-allocation syntax retain that ! 790: information in their external name. ! 791: ! 792: #pragma data_seg ( [[ "segment-name"[[, "segment-class"]] ) ! 793: ----------------------------------------------------------- ! 794: Specifies the default segment for data. This is equivalent to using the ! 795: /ND (name of DATA segment) compilation option. It is also equivalent to ! 796: specifying objects or pointers as based. You can, optionally, specify ! 797: the class as well as the segment name. For example: ! 798: ! 799: #pragma data_seg( "MY_DATA", "DATA" ) ! 800: ! 801: The preceding example causes functions following to be allocated in a ! 802: segment called MY_DATA. The segment is given a DATA class. ! 803: ! 804: Specifying the data_seg pragma with no arguments causes the compiler ! 805: to allocate all following data in the default data segment called ! 806: MY_DATA. The segment is given a DATA class. ! 807: ! 808: Note ! 809: ---- ! 810: There is no way to specify the segment class using based function ! 811: allocation or the /ND compilation option. ! 812: ! 813: Data allocated using the /ND option or data_seg pragma do not retain ! 814: any information about their location. However, data allocated using the ! 815: based syntax retain that information in their external name. ! 816: ! 817: If you compile with /Za, the data_seg pragma does not affect the ! 818: allocation of uninitialized objects. This is true under /Za. However, ! 819: under /Ze the uninitialized objects also get allocated in the segment ! 820: specified by the data_seg pragma. ! 821: ! 822: #pragma native_caller ( [[ { on | off } ]] ) ! 823: -------------------------------------------- ! 824: Controls the removal of native-code entry points from within source ! 825: code on a function by function basis. To suppress all native entry ! 826: points, use the /Gn command-line option. See the Programming Techniques ! 827: manual for more information about p-code. ! 828: ! 829: Page 210 ! 830: #pragma alloc_text( textsegment, function1, ...) ! 831: ------------------------------------------------ ! 832: Names the segment where the specified function definitions are to ! 833: reside. This must occur between a function declarator and the function ! 834: definition for the named functions. ! 835: ! 836: The recommended technique for functions in 16-bit targets is to use ! 837: __based to specify the function location. ! 838: ! 839: Use the alloc_text pragma for 32-bit targets since __based is not ! 840: supported for functions in 32-bit targets. ! 841: ! 842: Page 211 ! 843: #pragma intrinsic( function1 [[, function2, ...]] ) ! 844: --------------------------------------------------- ! 845: Specifies that calls to the specified functions are intrinsic (a ! 846: library function known to the compiler). Alternatively, you can use the ! 847: /Oi option to make intrinsic the default for functions that have ! 848: intrinsic forms. In this case, you can use the function pragma to ! 849: override /Oi for specified functions. This pragma cannot be used with ! 850: /f. This pragma takes effect at the first function defined after the ! 851: pragma is seen. ! 852: ! 853: The following functions have intrinsic forms for both the 16-bit and ! 854: 32-bit compilers: ! 855: ! 856: _alloca ! 857: _disable ! 858: _enable ! 859: _inp ! 860: _inpw ! 861: _lrotl ! 862: _lrotr ! 863: _outp ! 864: _outpw ! 865: _rotl ! 866: _rotr ! 867: _strset ! 868: abs ! 869: acos ! 870: asin ! 871: atan ! 872: atan2 ! 873: ceil ! 874: cos ! 875: cosh ! 876: exp ! 877: fabs ! 878: floor ! 879: fmod ! 880: labs ! 881: log ! 882: log10 ! 883: memcmp ! 884: memcpy ! 885: memset ! 886: pow ! 887: sin ! 888: sinh ! 889: sqrt ! 890: strcat ! 891: strcmp ! 892: strcpy ! 893: strlen ! 894: tan ! 895: tanh ! 896: ! 897: The following functions have intrinsic forms for the 16-bit compiler ! 898: only: ! 899: ! 900: _acosl ! 901: _asinl ! 902: _atanl ! 903: _atan2l ! 904: _ceill ! 905: _cosl ! 906: _coshl ! 907: _expl ! 908: _floorl ! 909: _fmodl ! 910: _logl ! 911: _log10l ! 912: _powl ! 913: _sinl ! 914: _sinhl ! 915: _sqrtl ! 916: _tanl ! 917: _tanhl ! 918: _fmemcmp ! 919: _fmemcpy ! 920: _fmemset ! 921: _fstrcat ! 922: _fstrcmp ! 923: _fstrcpy ! 924: _fstrlen ! 925: _fstrsetu ! 926: ! 927: Page 212 ! 928: #pragma optimize( "[[optimization-option-list]]", {off | on } ) ! 929: --------------------------------------------------------------- ! 930: Specifies optimizations to be performed. Must appear outside a ! 931: function. The optimization option list may be zero or more of the ! 932: following: a, c, e, g, l, n, p, q, t, and w. These letters correspond ! 933: to the /O compilation options. This pragma takes effect at the first ! 934: function defined after the pragma is seen. The optimization list for ! 935: 32-bit targets may be zero or more of the following: a, g, n, p, t, and ! 936: w. ! 937: ! 938: Page 212 ! 939: #pragma pack( [[{1 | 2 | 4 | 8 | 16 }]] ) ! 940: ----------------------------------------- ! 941: Specifies packing alignment for structure types. You can use the /Zp ! 942: option to specify the same packing for all structures in a module. The ! 943: default is 2 for 16- bit targets and 4 for 32-bit targets. ! 944: ! 945: When you give the /Zpn option, where n is 1, 2, 4, 8, or 16, each ! 946: structure member after the first is stored on n-byte boundaries, ! 947: depending on the number you choose. If you use the /Zp option without ! 948: an argument, structure members are packed on one-byte boundaries. No ! 949: space is allowed between /Zp and its argument. This pragma takes effect ! 950: at the first function defined after the pragma is seen. ! 951: ! 952: On 32-bit targets, the packing can be set at 8 or 16 as well as 1, 2, ! 953: or 4 as given for 16-bit targets. ! 954: ! 955: Page 240 ! 956: For the 32-bit compiler, long double and double are the same. ! 957: ! 958: ========================< Part 4: Linker Options >=========================== ! 959: ! 960: Throughout Programming Techniques (Chapter 1: Building Applications ! 961: and DLLs) and Tools (Chapter 5: Linker), the NOTMAPPED parameter for ! 962: the LINK and COFF /DEBUG: option is incorrectly given as "NOMAPPED." ! 963: The correct syntax for the /DEBUG option is: ! 964: ! 965: /DEBUG:[{MAPPED|NOTMAPPED},]{NONE|MINIMAL|PARTIAL|FULL} ! 966: ! 967: ! 968: =============< Part 5: Building Multithreaded Applications and DLLs >============ ! 969: ! 970: ! 971: The following information should be added to Programming Techniques ! 972: Chapter 1: Building Applications and DLLs: ! 973: ! 974: Building Multithreaded Programs ! 975: ------------------------------- ! 976: Building a multithreaded program is only slightly different from ! 977: building a single-threaded program. Two additional parameters must be ! 978: specified: ! 979: ! 980: 1. Compile with the /D_MT option. ! 981: ! 982: 2. Link with LIBCMT.LIB (multithread C run-time library) instead ! 983: of LIBC.LIB (single-thread C run-time library). ! 984: ! 985: Using the C Run-Time DLL ! 986: ------------------------ ! 987: You can reduce the size of an executable file by using the C run-time ! 988: DLL instead of statically linking the C run-time libraries to the ! 989: program. The cost is a small startup overhead to initialize the DLL, ! 990: and the normal DLL calling overhead. ! 991: ! 992: To use the C run-time DLL (CRTDLL.DLL) with either a single- threaded ! 993: or multithreaded program, link with CRTDLL.LIB. Do not link with either ! 994: LIBC.LIB or LIBCMT.LIB. The C run-time DLL supports both types of ! 995: programs. ! 996: ! 997: ! 998: =============< Part 6: The WinDebug Graphical Debugger >============= ! 999: ! 1000: ! 1001: Loading Programs ! 1002: ---------------- ! 1003: ! 1004: NOTE: The Program menu is disabled in this version of WinDebug. To ! 1005: load a program for debugging, you must enter the program ! 1006: name on the command-line when you start the debugger. For ! 1007: example: ! 1008: ! 1009: WINDBG MYPROG.EXE ! 1010: ! 1011: WINDBG C:\BUILDDIR\TESTOR.EXE ! 1012: ! 1013: ! 1014: ! 1015: Expression Evaluator ! 1016: -------------------- ! 1017: ! 1018: The expression evaluator in this release of WinDebug cannot ! 1019: evaluate a type-cast followed by the following characters: *, &, ! 1020: +, and |. You can acheive the same meaning by enclosing the casted ! 1021: expression in parenthesis. For example: ! 1022: ! 1023: (char *) &i ! 1024: ! 1025: would become ! 1026: ! 1027: (char *) (&i) ! 1028: ! 1029: ! 1030: ! 1031: Command Window ! 1032: -------------- ! 1033: ! 1034: Command Window Editing ! 1035: ---------------------- ! 1036: In the Command window, you can use editing keys similar to those ! 1037: available from the NT command prompt. The Up- and Down-Arrow keys let ! 1038: You retrieve previously-entered WinDebug commands. You can edit the ! 1039: current command line with the Backspace, Delete, Insert, and Left- ! 1040: and Right-Arrow keys. ! 1041: ! 1042: ! 1043: Process Specifiers ! 1044: ------------------ ! 1045: ! 1046: The process-specifier syntax should be as follows: ! 1047: ! 1048: Symbol Description ! 1049: ------ ----------- ! 1050: |. The current process. ! 1051: |number The process number. ! 1052: |* All processes. ! 1053: ! 1054: ! 1055: Set Breakpoint (BP) ! 1056: ------------------ ! 1057: ! 1058: The Set Breakpoint (BP) options /M and /H are not available in this ! 1059: release. ! 1060: ! 1061: With the /C option, you must enclose the semicolon-separated list ! 1062: of multiple commands in quotation marks. ! 1063: ! 1064: ! 1065: Enter ANSI Characters (EA) ! 1066: -------------------------- ! 1067: ! 1068: If you want to include space (" ") characters, you must enclose ! 1069: the character string in quotation marks (" or '). If you enclose ! 1070: the string in double quotation marks, WinDebug will automatically ! 1071: null-terminate the string. Single quotation marks (') will not add ! 1072: a null character. ! 1073: ! 1074: ! 1075: Display and Entry Commands (D* and E*) ! 1076: -------------------------------------- ! 1077: ! 1078: The display and entry commands (such as DD and EB) will use the ! 1079: current default radix. You can enter numbers with a different radix ! 1080: by using the standard C/C++ radix overrides (such as 0x). ! 1081: ! 1082: ! 1083: Find and Search (F and S) ! 1084: ------------------------- ! 1085: ! 1086: These commands are unavailable in this release. ! 1087: ! 1088: ! 1089: Display Stack Backtrace (K) ! 1090: --------------------------- ! 1091: ! 1092: This command can be used when handling an exception. ! 1093: ! 1094: ! 1095: Set Exceptions (SX*) ! 1096: -------------------- ! 1097: ! 1098: These commands can be followed by /C2<commandlist>, where ! 1099: <commandlist> is a quote-enclosed, semicolon-separated list of ! 1100: WinDebug commands to execute after an exception is handled. The ! 1101: SXE command can also be followed by /C<commandlist>, where ! 1102: <commandlist> specifies commands to execute before an exception ! 1103: triggers the debugger.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.