MSGTEST.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

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