Annotation of q_a/samples/msgtable/msgtest.c, revision 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.