CmnHdr.h
上传用户:wpp2016
上传日期:2010-02-01
资源大小:1250k
文件大小:8k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. /******************************************************************************
  2. Module name: CmnHdr.h
  3. Written by: Jeffrey Richter
  4. Notices: Copyright (c) 1995-1997 Jeffrey Richter
  5. Purpose: Common header file containing handy macros and definitions used
  6.          throughout all the applications in the book.
  7. ******************************************************************************/
  8. /* Disable ridiculous warnings so that the code */
  9. /* compiles cleanly using warning level 4.      */
  10. /* nonstandard extension 'single line comment' was used */
  11. #pragma warning(disable: 4001)
  12. // nonstandard extension used : nameless struct/union
  13. #pragma warning(disable: 4201)
  14. // nonstandard extension used : bit field types other than int
  15. #pragma warning(disable: 4214)
  16. // Note: Creating precompiled header 
  17. #pragma warning(disable: 4699)
  18. // unreferenced inline function has been removed
  19. #pragma warning(disable: 4514)
  20. // unreferenced formal parameter
  21. #pragma warning(disable: 4100)
  22. // indirection to slightly different base types
  23. #pragma warning(disable: 4057)
  24. // named type definition in parentheses
  25. #pragma warning(disable: 4115)
  26. // nonstandard extension used : benign typedef redefinition
  27. #pragma warning(disable: 4209)
  28. //////////////////////// Windows Version Build Option /////////////////////////
  29. #define _WIN32_WINNT 0x0400
  30. ///////////////////////////// STRICT Build Option /////////////////////////////
  31. // Force all EXEs/DLLs to use STRICT type checking.
  32. #define STRICT
  33. /////////////////////////// CPU Portability Macros ////////////////////////////
  34. // If no CPU platform was specified, default to the current platform.
  35. #if !defined(_PPC_) && !defined(_ALPHA_) && !defined(_MIPS_) && !defined(_X86_)
  36.    #if defined(_M_IX86)
  37.       #define _X86_
  38.    #endif
  39.    #if defined(_M_MRX000)
  40.       #define _MIPS_
  41.    #endif
  42.    #if defined(_M_ALPHA)
  43.       #define _ALPHA_
  44.    #endif
  45.    #if defined(_M_PPC)
  46.       #define _PPC_
  47.    #endif
  48. #endif
  49. //////////////////////////// Unicode Build Option /////////////////////////////
  50. // If we are not compiling for an x86 CPU, we always compile using Unicode.
  51. #ifndef _X86_
  52. #define UNICODE
  53. #endif
  54. // To compile using Unicode on the x86 CPU, uncomment the line below.
  55. //#define UNICODE
  56. // When using Unicode Win32 functions, use Unicode C-Runtime functions too.
  57. #ifdef UNICODE
  58. #define _UNICODE
  59. #endif
  60. //////////////////////////////// chDIMOF Macro ////////////////////////////////
  61. // This macro evaluates to the number of elements in an array. 
  62. #define chDIMOF(Array) (sizeof(Array) / sizeof(Array[0]))
  63. ///////////////////////////// chBEGINTHREADEX Macro ///////////////////////////
  64. // Create a chBEGINTHREADEX macro that calls the C run-time's
  65. // _beginthreadex function. The C run-time library doesn't
  66. // want to have any reliance on Win32 data types such as
  67. // HANDLE. This means that a Win32 programmer needs to cast
  68. // the return value to a HANDLE. This is terribly inconvenient,
  69. // so I have created this macro to perform the casting.
  70. typedef unsigned (__stdcall *PTHREAD_START) (void *);
  71. #define chBEGINTHREADEX(lpsa, cbStack, lpStartAddr, 
  72.    lpvThreadParm, fdwCreate, lpIDThread)            
  73.       ((HANDLE)_beginthreadex(                      
  74.          (void *) (lpsa),                           
  75.          (unsigned) (cbStack),                      
  76.          (PTHREAD_START) (lpStartAddr),             
  77.          (void *) (lpvThreadParm),                  
  78.          (unsigned) (fdwCreate),                    
  79.          (unsigned *) (lpIDThread)))
  80. //////////////////////////// Assert/Verify Macros /////////////////////////////
  81. #define chFAIL(szMSG) {                                                   
  82.       MessageBox(GetActiveWindow(), szMSG,                                
  83.          __TEXT("Assertion Failed"), MB_OK | MB_ICONERROR);               
  84.       DebugBreak();                                                       
  85.    }
  86. // Put up an assertion failure message box.
  87. #define chASSERTFAIL(file,line,expr) {                                    
  88.       TCHAR sz[128];                                                      
  89.       wsprintf(sz, __TEXT("File %hs, line %d : %hs"), file, line, expr);  
  90.       chFAIL(sz);                                                         
  91.    }
  92. // Put up a message box if an assertion fails in a debug build.
  93. #ifdef _DEBUG
  94. #define chASSERT(x) if (!(x)) chASSERTFAIL(__FILE__, __LINE__, #x)
  95. #else
  96. #define chASSERT(x)
  97. #endif
  98. // Assert in debug builds, but don't remove the code in retail builds.
  99. #ifdef _DEBUG
  100. #define chVERIFY(x) chASSERT(x)
  101. #else
  102. #define chVERIFY(x) (x)
  103. #endif
  104. /////////////////////////// chHANDLE_DLGMSG Macro /////////////////////////////
  105. // The normal HANDLE_MSG macro in WINDOWSX.H does not work properly for dialog
  106. // boxes because DlgProc return a BOOL instead of an LRESULT (like
  107. // WndProcs). This chHANDLE_DLGMSG macro corrects the problem:
  108. #define chHANDLE_DLGMSG(hwnd, message, fn)                           
  109.    case (message): return (SetDlgMsgResult(hwnd, uMsg,               
  110.       HANDLE_##message((hwnd), (wParam), (lParam), (fn))))
  111. /////////////////////////// Quick MessageBox Macro ////////////////////////////
  112. #define chMB(s) {                                                    
  113.       TCHAR szTMP[128];                                              
  114.       GetModuleFileName(NULL, szTMP, chDIMOF(szTMP));                
  115.       MessageBox(GetActiveWindow(), s, szTMP, MB_OK);                
  116.    }
  117. ///////////////////////////// Zero Variable Macro /////////////////////////////
  118. // Zero out a structure. If fInitSize is TRUE, initialize the first int to
  119. // the size of the structure. Many structures like WNDCLASSEX and STARTUPINFO
  120. // require that their first member be set to the size of the structure itself.
  121. #define chINITSTRUCT(structure, fInitSize)                           
  122.    (ZeroMemory(&(structure), sizeof(structure)),                     
  123.    fInitSize ? (*(int*) &(structure) = sizeof(structure)) : 0)
  124. //////////////////////// Dialog Box Icon Setting Macro ////////////////////////
  125. // The call to SetClassLong is for Windows NT 3.51 or less.  The WM_SETICON
  126. // messages are for Windows NT 4.0 and Windows 95.
  127. #define chSETDLGICONS(hwnd, idiLarge, idiSmall)                               
  128.    {                                                                          
  129.       OSVERSIONINFO VerInfo;                                                  
  130.       chINITSTRUCT(VerInfo, TRUE);                                            
  131.       GetVersionEx(&VerInfo);                                                 
  132.       if ((VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) &&                  
  133.           (VerInfo.dwMajorVersion <= 3 && VerInfo.dwMinorVersion <= 51)) {    
  134.          SetClassLong(hwnd, GCL_HICON, (LONG)                                 
  135.             LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiLarge)));    
  136.       } else {                                                                
  137.          SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)                        
  138.             LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiLarge)));    
  139.          SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)                        
  140.             LoadIcon(GetWindowInstance(hwnd), MAKEINTRESOURCE(idiSmall)));    
  141.       }                                                                       
  142.    }
  143.     
  144. ///////////////////////////// UNICODE Check Macro /////////////////////////////
  145. #ifdef UNICODE
  146. #define chWARNIFUNICODEUNDERWIN95()                                        
  147.    if (GetWindowsDirectoryW(NULL, 0) <= 0)                                 
  148.       MessageBoxA(NULL, "This operating system doesn't support Unicode.",  
  149.          NULL, MB_OK)
  150. #else
  151. #define chWARNIFUNICODEUNDERWIN95()
  152. #endif
  153. ///////////////////////// Pragma message helper macro /////////////////////////
  154. /* 
  155. When the compiler sees a line like this:
  156. #pragma chMSG(Fix this later)
  157. it outputs a line like this:
  158. C:DocumentAdvWinCodeSysinfo.06..CmnHdr.H(296):Fix this later
  159. You can easily jump directly to this line and examine the surrounding code.
  160. */
  161. #define chSTR(x)    #x
  162. #define chSTR2(x) chSTR(x)
  163. #define chMSG(desc) message(__FILE__ "(" chSTR2(__LINE__) "):" #desc)
  164. ///////////////////////////////// End of File /////////////////////////////////