Annotation of q_a/samples/msgtable/msgtest.c, revision 1.1.1.1

1.1       root        1: /* Microsoft Developer Support
                      2:    Copyright (c) 1992, 1993 Microsoft Corporation */
                      3: 
                      4: #include <windows.h>
                      5: #include <stdio.h>
                      6: 
                      7: /* messages.h is created by mc.exe when compiling messages.mc */
                      8: #include "messages.h"
                      9: 
                     10: #define MAX_MESSAGES 5
                     11: #define MAX_MSG_LENGTH 1024
                     12: #define SEVERITY_MASK 0xC0000000
                     13: #define FACILITY_MASK 0x0FFF0000
                     14: #define MSG_ID_MASK 0x0000FFFF
                     15: 
                     16: 
                     17: /********************************************************************
                     18: * FUNCTION: myPutMsg(HINSTANCE hLib, LPVOID lpArgs, DWORD dwMsgId)  *
                     19: *                                                                   *
                     20: * PURPOSE: format and output error dwMsgId, with insert strings     *
                     21: *          lpArgs, from the messagetable resource in the DLL        *
                     22: *          referenced by handle hLib                                *
                     23: *                                                                   *
                     24: * INPUT: Library handle, insert strings, and message ID number      *
                     25: *                                                                   *
                     26: * RETURNS: none                                                     *
                     27: ********************************************************************/
                     28: 
                     29: void myPutMsg(HINSTANCE hLib, LPVOID lpArgs, DWORD dwMsgId)
                     30: {
                     31:   BOOL bSuccess;
                     32:   LPTSTR msgBuf;  /* hold text of the error message that we build */
                     33:   int dwCode;  /* hold various codes extracted from dwMsgId */
                     34: 
                     35:   /* Here is the layout of the message ID:
                     36: 
                     37:    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
                     38:    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
                     39:   +---+-+-+-----------------------+-------------------------------+
                     40:   |Sev|C|R|     Facility          |               Code            |
                     41:   +---+-+-+-----------------------+-------------------------------+
                     42: 
                     43:   where
                     44: 
                     45:       Sev - is the severity code
                     46:       C - is the Customer code flag
                     47:       R - is a reserved bit
                     48:       Facility - is the facility code
                     49:       Code - is the facility's status code
                     50:   */
                     51: 
                     52:   printf("Severity: ");
                     53:   /* output the severity and facility code. Mask off the severity */
                     54:   /* bits with SEVERITY_MASK and shift them down */
                     55:   dwCode = (dwMsgId & SEVERITY_MASK) >> 30;
                     56:   switch (dwCode)
                     57:     {
                     58:     case STATUS_SEVERITY_WARNING:
                     59:       printf("STATUS_SEVERITY_WARNING"); break;
                     60:     case STATUS_SEVERITY_SUCCESS:
                     61:       printf("STATUS_SEVERITY_SUCCESS"); break;
                     62:     case STATUS_SEVERITY_INFORMATIONAL:
                     63:       printf("STATUS_SEVERITY_INFORMATIONAL"); break;
                     64:     case STATUS_SEVERITY_ERROR:
                     65:       printf("STATUS_SEVERITY_ERROR"); break;
                     66:     default:
                     67:       printf("Unknown!"); break;
                     68:     }
                     69:   printf ("\nFacility: ");
                     70:   /* Mask off the facility bits with FACILITY_MASK and shift them down */
                     71:   dwCode = (dwMsgId & FACILITY_MASK) >> 16;
                     72:   switch (dwCode)
                     73:     {
                     74:     case FACILITY_SYSTEM:
                     75:       printf("FACILITY_SYSTEM"); break;
                     76:     case FACILITY_STUBS:
                     77:       printf("FACILITY_STUBS"); break;
                     78:     case FACILITY_RUNTIME:
                     79:       printf("FACILITY_RUNTIME"); break;
                     80:     case FACILITY_IO_ERROR_CODE:
                     81:       printf("FACILITY_IO_ERROR_CODE"); break;
                     82:     default:
                     83:       printf("Unknown!"); break;
                     84:     }
                     85:   /* retrieve and format the message from the messagetable DLL */
                     86:   bSuccess = FormatMessage(
                     87:       FORMAT_MESSAGE_FROM_HMODULE | /* get the message from the DLL */
                     88:       FORMAT_MESSAGE_ALLOCATE_BUFFER | /* allocate the msg buffer for us */
                     89:       FORMAT_MESSAGE_ARGUMENT_ARRAY | /* lpArgs is an array of pointers */
                     90:       60, /* line length for the mesages */
                     91:       hLib, /* the messagetable DLL handle */
                     92:       dwMsgId, /* message ID */
                     93:       MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), /* language ID */
                     94:       (LPTSTR) &msgBuf, /* address of pointer to buffer for message */
                     95:       MAX_MSG_LENGTH, /* maximum size of the message buffer */
                     96:       lpArgs); /* array of insert strings for the message */
                     97:   if (!bSuccess)
                     98:     printf("Error %d from FormatMessage\n", GetLastError());
                     99:   else
                    100:     {
                    101:     /* mask off the actual message number with MSG_ID_MASK and show it */
                    102:     printf("\nError: %d: %s", dwMsgId & MSG_ID_MASK, msgBuf);
                    103:     /* Free the buffer that FormatMessage allocated for us. */
                    104:     LocalFree((HLOCAL) msgBuf);
                    105:     }
                    106:   puts("\n__________\n");
                    107:   CloseHandle(hLib);
                    108: }
                    109: 
                    110: /********************************************************************
                    111: * FUNCTION: main()                                                  *
                    112: *                                                                   *
                    113: * PURPOSE: Load the message resource DLL, and call myPutMsg() to    *
                    114: *          format and output error messages to the user             *
                    115: *                                                                   *
                    116: * INPUT: none                                                       *
                    117: *                                                                   *
                    118: * RETURNS: none                                                     *
                    119: ********************************************************************/
                    120: 
                    121: int main()
                    122: {
                    123:   HINSTANCE hLib;  /* handle to the messagetable DLL */
                    124:   char *aInsertStrs[8];  /* array of pointers to insert strings */
                    125:   /* Check to make sure we are running on Windows NT */
                    126:   if( GetVersion() & 0x80000000 )
                    127:     {
                    128:     MessageBox(NULL, "Sorry, this application requires Windows NT.\n"
                    129:         "This application will now terminate.",
                    130:         "Error: Windows NT Required to Run",  MB_OK );
                    131:     return(1);
                    132:     }
                    133:   /* Load the resource library without calling any entry points since */
                    134:   /* this is a resource-only DLL */
                    135:   hLib = LoadLibraryEx("messages.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
                    136:   if (!hLib)
                    137:     printf("Error %d from LoadLibrary\n", GetLastError());
                    138: 
                    139:   /* Output some error messages from the messagetable DLL */
                    140:   /* The first three have no insert strings */
                    141:   myPutMsg(hLib, NULL, MSG_BAD_COMMAND);
                    142:   myPutMsg(hLib, NULL, MSG_BAD_PARM1);
                    143:   myPutMsg(hLib, NULL, MSG_STRIKE_ANY_KEY);
                    144:   /* wait for user to hit enter as per last error message */
                    145:   getchar();
                    146:   /* The next two messages contain insert strings - set up our array */
                    147:   /* of insert strings and pass the array to myPutMsg() */
                    148:   aInsertStrs[0] = "foo.c";
                    149:   aInsertStrs[1] = "BAR";
                    150:   myPutMsg(hLib, aInsertStrs, MSG_CMD_DELETE);
                    151:   aInsertStrs[0] = "47";
                    152:   aInsertStrs[1] = "5";
                    153:   myPutMsg(hLib, aInsertStrs, MSG_RETRYS);
                    154:   return(0);
                    155: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.