Error.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // VirtualDub - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include "VirtualDub.h"
  18. #include <stdio.h>
  19. #include <stdarg.h>
  20. #include <crtdbg.h>
  21. #include <windows.h>
  22. #include "Error.h"
  23. MyError::MyError() {
  24. buf = NULL;
  25. }
  26. MyError::MyError(MyError& err) {
  27. buf = new char[strlen(err.buf)+1];
  28. if (buf)
  29. strcpy(buf,err.buf);
  30. }
  31. MyError::MyError(const char *f, ...) {
  32. va_list val;
  33. va_start(val, f);
  34. vsetf(f, val);
  35. va_end(val);
  36. }
  37. MyError::~MyError() {
  38. delete[] buf;
  39. }
  40. void MyError::setf(const char *f, ...) {
  41. va_list val;
  42. va_start(val, f);
  43. vsetf(f,val);
  44. va_end(val);
  45. }
  46. void MyError::vsetf(const char *f, va_list val) {
  47. buf = new char[1024];
  48. if (buf) {
  49. buf[1023] = 0;
  50. _vsnprintf(buf, 1023, f, val);
  51. }
  52. }
  53. void MyError::post(HWND hWndParent, const char *title) {
  54. if (!buf || !*buf)
  55. return;
  56. _RPT2(0,"*** %s: %sn", title, buf);
  57. MessageBox(/*hWndParent*/NULL, buf, title, MB_OK | MB_ICONERROR);
  58. }
  59. void MyError::discard() {
  60. buf = NULL;
  61. }
  62. MyICError::MyICError(const char *s, DWORD icErr) {
  63. const char *err = "(Unknown)";
  64. switch(icErr) {
  65. case ICERR_OK: err = "no error"; break;
  66. case ICERR_UNSUPPORTED: err = "unsupported"; break;
  67. case ICERR_BADFORMAT: err = "bad format"; break;
  68. case ICERR_MEMORY: err = "out of memory"; break;
  69. case ICERR_INTERNAL: err = "internal error"; break;
  70. case ICERR_BADFLAGS: err = "bad flags"; break;
  71. case ICERR_BADPARAM: err = "bad parameters"; break;
  72. case ICERR_BADSIZE: err = "bad data size"; break;
  73. case ICERR_BADHANDLE: err = "bad handle"; break;
  74. case ICERR_CANTUPDATE: err = "can't update"; break;
  75. case ICERR_ABORT: err = "aborted by user"; break;
  76. case ICERR_ERROR: err = "unspecified error"; break;
  77. case ICERR_BADBITDEPTH: err = "can't handle bit depth"; break;
  78. case ICERR_BADIMAGESIZE: err = "bad image size"; break;
  79. default:
  80. if (icErr <= ICERR_CUSTOM) err = "<custom error>";
  81. break;
  82. }
  83. setf("%s error: %s (%ld)", s, err, icErr);
  84. }
  85. MyMMIOError::MyMMIOError(const char *s, DWORD mmioerr) {
  86. const char *err = "(Unknown)";
  87. switch(mmioerr) {
  88. case MMIOERR_FILENOTFOUND: err = "file not found"; break;
  89. case MMIOERR_OUTOFMEMORY: err = "out of memory"; break;
  90. case MMIOERR_CANNOTOPEN: err = "couldn't open"; break;
  91. case MMIOERR_CANNOTCLOSE: err = "couldn't close"; break;
  92. case MMIOERR_CANNOTREAD: err = "couldn't read"; break;
  93. case MMIOERR_CANNOTWRITE: err = "couldn't write"; break;
  94. case MMIOERR_CANNOTSEEK: err = "couldn't seek"; break;
  95. case MMIOERR_CANNOTEXPAND: err = "couldn't expand"; break;
  96. case MMIOERR_CHUNKNOTFOUND: err = "chunk not found"; break;
  97. case MMIOERR_UNBUFFERED: err = "unbuffered"; break;
  98. case MMIOERR_PATHNOTFOUND: err = "path not found"; break;
  99. case MMIOERR_ACCESSDENIED: err = "access denied"; break;
  100. case MMIOERR_SHARINGVIOLATION: err = "sharing violation"; break;
  101. case MMIOERR_NETWORKERROR: err = "network error"; break;
  102. case MMIOERR_TOOMANYOPENFILES: err = "too many open files"; break;
  103. case MMIOERR_INVALIDFILE: err = "invalid file"; break;
  104. }
  105. setf("%s error: %s (%ld)", s, err, mmioerr);
  106. }
  107. MyAVIError::MyAVIError(const char *s, DWORD avierr) {
  108. const char *err = "(Unknown)";
  109. switch(avierr) {
  110. case AVIERR_UNSUPPORTED: err = "unsupported"; break;
  111. case AVIERR_BADFORMAT: err = "bad format"; break;
  112. case AVIERR_MEMORY: err = "out of memory"; break;
  113. case AVIERR_INTERNAL: err = "internal error"; break;
  114. case AVIERR_BADFLAGS: err = "bad flags"; break;
  115. case AVIERR_BADPARAM: err = "bad parameters"; break;
  116. case AVIERR_BADSIZE: err = "bad size"; break;
  117. case AVIERR_BADHANDLE: err = "bad AVIFile handle"; break;
  118. case AVIERR_FILEREAD: err = "file read error"; break;
  119. case AVIERR_FILEWRITE: err = "file write error"; break;
  120. case AVIERR_FILEOPEN: err = "file open error"; break;
  121. case AVIERR_COMPRESSOR: err = "compressor error"; break;
  122. case AVIERR_NOCOMPRESSOR: err = "compressor not available"; break;
  123. case AVIERR_READONLY: err = "file marked read-only"; break;
  124. case AVIERR_NODATA: err = "no data (?)"; break;
  125. case AVIERR_BUFFERTOOSMALL: err = "buffer too small"; break;
  126. case AVIERR_CANTCOMPRESS: err = "can't compress (?)"; break;
  127. case AVIERR_USERABORT: err = "aborted by user"; break;
  128. case AVIERR_ERROR: err = "error (?)"; break;
  129. }
  130. setf("%s error: %s (%08lx)", s, err, avierr);
  131. }
  132. MyMemoryError::MyMemoryError() {
  133. setf("Out of memory");
  134. }
  135. MyWin32Error::MyWin32Error(const char *format, DWORD err, ...) {
  136. char szError[128];
  137. char szTemp[256];
  138. va_list val;
  139. FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  140. 0,
  141. err,
  142. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  143. szError,
  144. sizeof szError,
  145. NULL);
  146. if (szError[0]) {
  147. long l = strlen(szError);
  148. if (l>1 && szError[l-2] == 'r')
  149. szError[l-2] = 0;
  150. else if (szError[l-1] == 'n')
  151. szError[l-1] = 0;
  152. }
  153. va_start(val, err);
  154. szTemp[sizeof szTemp-1] = 0;
  155. _vsnprintf(szTemp, sizeof szTemp, format, val);
  156. va_end(val);
  157. setf(szTemp, szError);
  158. }
  159. MyCrashError::MyCrashError(const char *format, DWORD dwExceptionCode) {
  160. const char *s = "(Unknown Exception)";
  161. switch(dwExceptionCode) {
  162. case EXCEPTION_ACCESS_VIOLATION:
  163. s = "Access Violation";
  164. break;
  165. case EXCEPTION_PRIV_INSTRUCTION:
  166. s = "Privileged Instruction";
  167. break;
  168. case EXCEPTION_INT_DIVIDE_BY_ZERO:
  169. s = "Integer Divide By Zero";
  170. break;
  171. case EXCEPTION_BREAKPOINT:
  172. s = "User Breakpoint";
  173. break;
  174. }
  175. setf(format, s);
  176. }
  177. MyUserAbortError::MyUserAbortError() {
  178. buf = strdup("");
  179. }