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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: debug.c
  6.  *  Content: debug code
  7.  *
  8.  ***************************************************************************/
  9. #include <windows.h>
  10. #include <windowsx.h>
  11. #include <stdarg.h>
  12. #include <dsound.h>
  13. #include "debug.h"
  14. #if defined(DEBUG) || defined(_DEBUG)
  15. //
  16. //  since we don't UNICODE our debugging messages, use the ASCII entry
  17. //  points regardless of how we are compiled.
  18. //
  19. #ifdef _WIN32
  20.     #include <wchar.h>
  21. #else
  22.     #define lstrcatA            lstrcat
  23.     #define lstrlenA            lstrlen
  24.     #define GetProfileIntA      GetProfileInt
  25.     #define OutputDebugStringA  OutputDebugString
  26.     #define wsprintfA           wsprintf
  27.     #define MessageBoxA         MessageBox
  28. #endif
  29. //
  30. //
  31. //
  32. BOOL    __gfDbgEnabled          = TRUE;         // master enable
  33. UINT    __guDbgLevel            = 0;            // current debug level
  34. //--------------------------------------------------------------------------;
  35. //  
  36. //  void DbgVPrintF
  37. //  
  38. //  Description:
  39. //  
  40. //  
  41. //  Arguments:
  42. //      LPSTR szFormat:
  43. //  
  44. //      va_list va:
  45. //  
  46. //  Return (void):
  47. //      No value is returned.
  48. //  
  49. //--------------------------------------------------------------------------;
  50. void FAR CDECL DbgVPrintF
  51. (
  52.     LPSTR                   szFormat,
  53.     va_list                 va
  54. )
  55. {
  56.     char                ach[DEBUG_MAX_LINE_LEN];
  57.     BOOL                fDebugBreak = FALSE;
  58.     BOOL                fPrefix     = TRUE;
  59.     BOOL                fCRLF       = TRUE;
  60.     ach[0] = '';
  61.     for (;;)
  62.     {
  63.         switch (*szFormat)
  64.         {
  65.             case '!':
  66.                 fDebugBreak = TRUE;
  67.                 szFormat++;
  68.                 continue;
  69.             case '`':
  70.                 fPrefix = FALSE;
  71.                 szFormat++;
  72.                 continue;
  73.             case '~':
  74.                 fCRLF = FALSE;
  75.                 szFormat++;
  76.                 continue;
  77.         }
  78.         break;
  79.     }
  80.     if (fDebugBreak)
  81.     {
  82.         ach[0] = '07';
  83.         ach[1] = '';
  84.     }
  85.     if (fPrefix)
  86.     {
  87.         lstrcatA(ach, DEBUG_MODULE_NAME ": ");
  88.     }
  89. #ifdef _WIN32
  90.     wvsprintfA(ach + lstrlenA(ach), szFormat, va);
  91. #else
  92.     wvsprintf(ach + lstrlenA(ach), szFormat, (LPSTR)va);
  93. #endif
  94.     if (fCRLF)
  95.     {
  96.         lstrcatA(ach, "rn");
  97.     }
  98.     OutputDebugStringA(ach);
  99.     if (fDebugBreak)
  100.     {
  101.         DebugBreak();
  102.     }
  103. } // DbgVPrintF()
  104. //--------------------------------------------------------------------------;
  105. //  
  106. //  void dprintf
  107. //  
  108. //  Description:
  109. //      dprintf() is called by the DPF() macro if DEBUG is defined at compile
  110. //      time. It is recommended that you only use the DPF() macro to call
  111. //      this function--so you don't have to put #ifdef DEBUG around all
  112. //      of your code.
  113. //      
  114. //  Arguments:
  115. //      UINT uDbgLevel:
  116. //  
  117. //      LPSTR szFormat:
  118. //  
  119. //  Return (void):
  120. //      No value is returned.
  121. //
  122. //--------------------------------------------------------------------------;
  123. void FAR CDECL dprintf
  124. (
  125.     UINT                    uDbgLevel,
  126.     LPSTR                   szFormat,
  127.     ...
  128. )
  129. {
  130.     va_list va;
  131.     if (!__gfDbgEnabled || (__guDbgLevel < uDbgLevel))
  132.         return;
  133.     va_start(va, szFormat);
  134.     DbgVPrintF(szFormat, va);
  135.     va_end(va);
  136. } // dprintf()
  137. //--------------------------------------------------------------------------;
  138. //  
  139. //  BOOL DbgEnable
  140. //  
  141. //  Description:
  142. //  
  143. //  
  144. //  Arguments:
  145. //      BOOL fEnable:
  146. //  
  147. //  Return (BOOL):
  148. //      Returns the previous debugging state.
  149. //  
  150. //--------------------------------------------------------------------------;
  151. BOOL WINAPI DbgEnable
  152. (
  153.     BOOL                    fEnable
  154. )
  155. {
  156.     BOOL                fOldState;
  157.     fOldState      = __gfDbgEnabled;
  158.     __gfDbgEnabled = fEnable;
  159.     return (fOldState);
  160. } // DbgEnable()
  161. //--------------------------------------------------------------------------;
  162. //  
  163. //  UINT DbgSetLevel
  164. //  
  165. //  Description:
  166. //  
  167. //  
  168. //  Arguments:
  169. //      UINT uLevel:
  170. //  
  171. //  Return (UINT):
  172. //      Returns the previous debugging level.
  173. //  
  174. //--------------------------------------------------------------------------;
  175. UINT WINAPI DbgSetLevel
  176. (
  177.     UINT                    uLevel
  178. )
  179. {
  180.     UINT                uOldLevel;
  181.     uOldLevel    = __guDbgLevel;
  182.     __guDbgLevel = uLevel;
  183.     return (uOldLevel);
  184. } // DbgSetLevel()
  185. //--------------------------------------------------------------------------;
  186. //  
  187. //  UINT DbgGetLevel
  188. //  
  189. //  Description:
  190. //  
  191. //  
  192. //  Arguments:
  193. //      None.
  194. //  
  195. //  Return (UINT):
  196. //      Returns the current debugging level.
  197. //  
  198. //--------------------------------------------------------------------------;
  199. UINT WINAPI DbgGetLevel
  200. (
  201.     void
  202. )
  203. {
  204.     return (__guDbgLevel);
  205. } // DbgGetLevel()
  206. //--------------------------------------------------------------------------;
  207. //  
  208. //  UINT DbgInitialize
  209. //  
  210. //  Description:
  211. //  
  212. //  
  213. //  Arguments:
  214. //      BOOL fEnable:
  215. //  
  216. //  Return (UINT):
  217. //      Returns the debugging level that was set.
  218. //  
  219. //--------------------------------------------------------------------------;
  220. UINT WINAPI DbgInitialize
  221. (
  222.     BOOL                    fEnable
  223. )
  224. {
  225.     UINT                uLevel;
  226.     uLevel = GetProfileIntA(DEBUG_SECTION, DEBUG_MODULE_NAME, (UINT)-1);
  227.     if ((UINT)-1 == uLevel)
  228.     {
  229.         //
  230.         //  if the debug key is not present, then force debug output to
  231.         //  be disabled. this way running a debug version of a component
  232.         //  on a non-debugging machine will not generate output unless
  233.         //  the debug key exists.
  234.         //
  235.         uLevel  = 0;
  236.         fEnable = FALSE;
  237.     }
  238.     DbgSetLevel(uLevel);
  239.     DbgEnable(fEnable);
  240.     return (__guDbgLevel);
  241. } // DbgInitialize()
  242. void WINAPI DbgDumpWFX( int nLevel, PWAVEFORMATEX pwfx )
  243.     {
  244.     DPF( nLevel, "Dumping WAVEFORMATEX at 0x%08lX", pwfx );
  245.     DPF( nLevel, "wFormatTag = %u, nChannels = %u, nSamplesPerSec = %lu",
  246. pwfx->wFormatTag, pwfx->nChannels, pwfx->nSamplesPerSec );
  247.     DPF( nLevel, "nAvgBytesPerSec = %lu, nBlockAlign = %u, wBitsPerSample = %lu",
  248. pwfx->nAvgBytesPerSec, pwfx->nBlockAlign, pwfx->wBitsPerSample );
  249.     DPF( nLevel, "cbSize = %u",pwfx->cbSize );
  250.     }
  251. //--------------------------------------------------------------------------;
  252. //  
  253. //  void _Assert
  254. //  
  255. //  Description:
  256. //      This routine is called if the ASSERT macro (defined in debug.h)
  257. //      tests and expression that evaluates to FALSE.  This routine 
  258. //      displays an "assertion failed" message box allowing the user to
  259. //      abort the program, enter the debugger (the "retry" button), or
  260. //      ignore the assertion and continue executing.  The message box
  261. //      displays the file name and line number of the _Assert() call.
  262. //  
  263. //  Arguments:
  264. //      char *  szFile: Filename where assertion occurred.
  265. //      int     iLine:  Line number of assertion.
  266. //  
  267. //--------------------------------------------------------------------------;
  268. #ifndef _WIN32
  269. #pragma warning(disable:4704)
  270. #endif
  271. void WINAPI _Assert
  272. (
  273.     char *  szFile,
  274.     int     iLine
  275. )
  276. {
  277.     static char     ach[300];       // debug output (avoid stack overflow)
  278.     int             id;
  279. #ifndef _WIN32
  280.     int             iExitCode;
  281. #endif
  282.     wsprintfA(ach, "Assertion failed in file %s, line %d.  [Press RETRY to debug.]", (LPSTR)szFile, iLine);
  283.     id = MessageBoxA(NULL, ach, "Assertion Failed",
  284.             MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE );
  285. switch (id)
  286. {
  287. case IDABORT:               // Kill the application.
  288. #ifndef _WIN32
  289.         iExitCode = 0;
  290.         _asm
  291.         {
  292.         mov ah, 4Ch
  293.         mov al, BYTE PTR iExitCode
  294.         int     21h
  295.         }
  296. #else
  297.         FatalAppExit(0, TEXT("Good Bye"));
  298. #endif // WIN16
  299. break;
  300. case IDRETRY:               // Break into the debugger.
  301. DebugBreak();
  302. break;
  303. case IDIGNORE:              // Ignore assertion, continue executing.
  304. break;
  305. }
  306. } // _Assert
  307. #ifndef _WIN32
  308. #pragma warning(default:4704)
  309. #endif
  310. #endif // #if defined(DEBUG) || defined(_DEBUG)
  311. // Silly little function gives meaningful error messages from HRESULT's
  312. LPSTR TranslateDSError( HRESULT hr )
  313.     {
  314.     switch( hr )
  315. {
  316. case DSERR_ALLOCATED:
  317.     return "DSERR_ALLOCATED";
  318. case DSERR_CONTROLUNAVAIL:
  319.     return "DSERR_CONTROLUNAVAIL";
  320. case DSERR_INVALIDPARAM:
  321.     return "DSERR_INVALIDPARAM";
  322. case DSERR_INVALIDCALL:
  323.     return "DSERR_INVALIDCALL";
  324. case DSERR_GENERIC:
  325.     return "DSERR_GENERIC";
  326. case DSERR_PRIOLEVELNEEDED:
  327.     return "DSERR_PRIOLEVELNEEDED";
  328. case DSERR_OUTOFMEMORY:
  329.     return "DSERR_OUTOFMEMORY";
  330. case DSERR_BADFORMAT:
  331.     return "DSERR_BADFORMAT";
  332. case DSERR_UNSUPPORTED:
  333.     return "DSERR_UNSUPPORTED";
  334. case DSERR_NODRIVER:
  335.     return "DSERR_NODRIVER";
  336. case DSERR_ALREADYINITIALIZED:
  337.     return "DSERR_ALREADYINITIALIZED";
  338. case DSERR_NOAGGREGATION:
  339.     return "DSERR_NOAGGREGATION";
  340. case DSERR_BUFFERLOST:
  341.     return "DSERR_BUFFERLOST";
  342. case DSERR_OTHERAPPHASPRIO:
  343.     return "DSERR_OTHERAPPHASPRIO";
  344. case DSERR_UNINITIALIZED:
  345.     return "DSERR_UNINITIALIZED";
  346. default:
  347.     return "Unknown HRESULT";
  348. }
  349.     }