贴在这里吧
/******************************************************************************
Module name: CmnHdr.h
Written by: Jeffrey Richter
Notices: Copyright (c) 1995-1997 Jeffrey Richter
Purpose: Common header file containing handy macros and definitions used
         throughout all the applications in the book.
******************************************************************************/
/* Disable ridiculous warnings so that the code */
/* compiles cleanly using warning level 4.      *//* nonstandard extension 'single line comment' was used */
#pragma warning(disable: 4001)// nonstandard extension used : nameless struct/union
#pragma warning(disable: 4201)// nonstandard extension used : bit field types other than int
#pragma warning(disable: 4214)// Note: Creating precompiled header 
#pragma warning(disable: 4699)// unreferenced inline function has been removed
#pragma warning(disable: 4514)// unreferenced formal parameter
#pragma warning(disable: 4100)// indirection to slightly different base types
#pragma warning(disable: 4057)// named type definition in parentheses
#pragma warning(disable: 4115)// nonstandard extension used : benign typedef redefinition
#pragma warning(disable: 4209)
//////////////////////// Windows Version Build Option /////////////////////////
#define _WIN32_WINNT 0x0400
///////////////////////////// STRICT Build Option /////////////////////////////
// Force all EXEs/DLLs to use STRICT type checking.
#define STRICT
/////////////////////////// CPU Portability Macros ////////////////////////////
// If no CPU platform was specified, default to the current platform.
#if !defined(_PPC_) && !defined(_ALPHA_) && !defined(_MIPS_) && !defined(_X86_)
   #if defined(_M_IX86)
      #define _X86_
   #endif
   #if defined(_M_MRX000)
      #define _MIPS_
   #endif
   #if defined(_M_ALPHA)
      #define _ALPHA_
   #endif
   #if defined(_M_PPC)
      #define _PPC_
   #endif
#endif
//////////////////////////// Unicode Build Option /////////////////////////////
// If we are not compiling for an x86 CPU, we always compile using Unicode.
#ifndef _X86_
#define UNICODE
#endif
// To compile using Unicode on the x86 CPU, uncomment the line below.
//#define UNICODE// When using Unicode Win32 functions, use Unicode C-Runtime functions too.
#ifdef UNICODE
#define _UNICODE
#endif
//////////////////////////////// chDIMOF Macro ////////////////////////////////
// This macro evaluates to the number of elements in an array. 
#define chDIMOF(Array) (sizeof(Array) / sizeof(Array[0]))
///////////////////////////// chBEGINTHREADEX Macro ///////////////////////////
// Create a chBEGINTHREADEX macro that calls the C run-time's
// _beginthreadex function. The C run-time library doesn't
// want to have any reliance on Win32 data types such as
// HANDLE. This means that a Win32 programmer needs to cast
// the return value to a HANDLE. This is terribly inconvenient,
// so I have created this macro to perform the casting.
typedef unsigned (__stdcall *PTHREAD_START) (void *);#define chBEGINTHREADEX(lpsa, cbStack, lpStartAddr,    lpvThreadParm, fdwCreate, lpIDThread)                  ((HANDLE)_beginthreadex(                               (void *) (lpsa),                                    (unsigned) (cbStack),                               (PTHREAD_START) (lpStartAddr),                      (void *) (lpvThreadParm),                           (unsigned) (fdwCreate),                             (unsigned *) (lpIDThread)))
//////////////////////////// Assert/Verify Macros /////////////////////////////
#define chFAIL(szMSG) {                                                         MessageBox(GetActiveWindow(), szMSG,                                         __TEXT("Assertion Failed"), MB_OK | MB_ICONERROR);                     DebugBreak();                                                          }// Put up an assertion failure message box.
#define chASSERTFAIL(file,line,expr) {                                          TCHAR sz[128];                                                            wsprintf(sz, __TEXT("File %hs, line %d : %hs"), file, line, expr);        chFAIL(sz);                                                            }// Put up a message box if an assertion fails in a debug build.
#ifdef _DEBUG
#define chASSERT(x) if (!(x)) chASSERTFAIL(__FILE__, __LINE__, #x)
#else
#define chASSERT(x)
#endif// Assert in debug builds, but don't remove the code in retail builds.
#ifdef _DEBUG
#define chVERIFY(x) chASSERT(x)
#else
#define chVERIFY(x) (x)
#endif
/////////////////////////// chHANDLE_DLGMSG Macro /////////////////////////////
// The normal HANDLE_MSG macro in WINDOWSX.H does not work properly for dialog
// boxes because DlgProc return a BOOL instead of an LRESULT (like
// WndProcs). This chHANDLE_DLGMSG macro corrects the problem:
#define chHANDLE_DLGMSG(hwnd, message, fn)                              case (message): return (SetDlgMsgResult(hwnd, uMsg,                     HANDLE_##message((hwnd), (wParam), (lParam), (fn))))
/////////////////////////// Quick MessageBox Macro ////////////////////////////
#define chMB(s) {                                                          TCHAR szTMP[128];                                                    GetModuleFileName(NULL, szTMP, chDIMOF(szTMP));                      MessageBox(GetActiveWindow(), s, szTMP, MB_OK);                   }
///////////////////////////// Zero Variable Macro /////////////////////////////
// Zero out a structure. If fInitSize is TRUE, initialize the first int to
// the size of the structure. Many structures like WNDCLASSEX and STARTUPINFO
// require that their first member be set to the size of the structure itself.
#define chINITSTRUCT(structure, fInitSize)                              (ZeroMemory(&(structure), sizeof(structure)),                        fInitSize ? (*(int*) &(structure) = sizeof(structure)) : 0)
//////////////////////// Dialog Box Icon Setting Macro ////////////////////////
// The call to SetClassLong is for Windows NT 3.51 or less.  The WM_SETICON
// messages are for Windows NT 4.0 and Windows 95.
#define chSETDLGICONS(hwnd, idiLarge, idiSmall)                                  {                                                                                OSVERSIONINFO VerInfo;                                                        chINITSTRUCT(VerInfo, TRUE);                                                  GetVersionEx(&VerInfo);                                                       if ((VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) &&                            (VerInfo.dwMajorVersion <= 3 && VerInfo.dwMinorVersion <= 51)) {             SetClassLong(hwnd, GCL_HICON, (LONG)                                             LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiLarge)));          } else {                                                                         SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)                                    LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiLarge)));             SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)                                    LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiSmall)));          }                                                                          }
    ///////////////////////////// UNICODE Check Macro /////////////////////////////
#ifdef UNICODE#define chWARNIFUNICODEUNDERWIN95()                                           if (GetWindowsDirectoryW(NULL, 0) <= 0)                                       MessageBoxA(NULL, "This operating system doesn't support Unicode.",           NULL, MB_OK)#else#define chWARNIFUNICODEUNDERWIN95()#endif
///////////////////////// Pragma message helper macro /////////////////////////
/* 
When the compiler sees a line like this:
#pragma chMSG(Fix this later)it outputs a line like this:
C:\Document\AdvWin\Code\Sysinfo.06\..\CmnHdr.H(296):Fix this laterYou can easily jump directly to this line and examine the surrounding code.
*/
#define chSTR(x)    #x
#define chSTR2(x) chSTR(x)
#define chMSG(desc) message(__FILE__ "(" chSTR2(__LINE__) "):" #desc)
///////////////////////////////// End of File /////////////////////////////////