00001 //----------------------------------------------------------------------------- 00002 // A utility class that helps with HRESULTS and error checking. 00003 // To Use: 00004 // 00005 // HResult hr = comObj->func(); 00006 // 00007 // If the result fails, an exception will be thrown with the 00008 // offending HRESULT. 00009 // Typically, one uses this as: 00010 // 00011 // HRESULT someFunction() 00012 // { 00013 // HResult hr; 00014 // try 00015 // { 00016 // hr = comObj->func(); 00017 // } 00018 // catch(HRESULT hResult) 00019 // { 00020 // throw hResult; 00021 // } 00022 // return S_OK; 00023 // } 00024 00025 #ifndef _HRESULT_H__ 00026 #define _HRESULT_H__ 00027 #ifdef __APPLE__ 00028 #include <CoreFoundation/CFPluginCOM.h> 00029 #endif 00030 00031 #ifndef UNREFERENCED 00032 #define UNREFERENCED(param) ((void)(param)) 00033 #endif 00034 00035 00036 #ifdef _DEBUG 00037 #ifndef _WINDEF_ 00038 extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA (char const * str); 00039 #define OutputDebugString OutputDebugStringA 00040 #endif 00041 00042 #include <stdio.h> 00043 #include <stdarg.h> 00044 inline void dprintf (char const * format, ...) { 00045 char buffer[1024]; 00046 va_list arguments; 00047 00048 va_start (arguments, format); 00049 vsprintf (buffer, format, arguments); 00050 va_end (arguments); 00051 #ifdef _MSC_VER 00052 #ifndef _WIN32_WCE 00053 OutputDebugStringA (buffer); 00054 #endif 00055 #else 00056 fprintf (stderr, buffer); 00057 #endif 00058 } 00059 #else 00060 inline void dprintf (char const * format, ...) { 00061 UNREFERENCED(format); 00062 } 00063 #endif 00064 00065 00066 class HResult 00067 { 00068 public: 00069 HResult(HRESULT hr) 00070 { 00071 m_hr = hr; 00072 if(FAILED(hr)) 00073 { 00074 //throw hr; 00075 dprintf("HRESULT error %x\n", hr); 00076 } 00077 } 00078 HResult() 00079 { 00080 } 00081 00082 HResult& operator=(HRESULT hr) 00083 { 00084 m_hr = hr; 00085 if(FAILED(hr)) 00086 { 00087 //throw hr; 00088 dprintf("HRESULT error %x\n", hr); 00089 } 00090 return *this; 00091 } 00092 00093 bool operator==(HRESULT hr) 00094 { 00095 if (m_hr==hr) 00096 { 00097 return true; 00098 } 00099 else 00100 { 00101 return false; 00102 } 00103 } 00104 00105 bool Succeeded() 00106 { 00107 return SUCCEEDED(m_hr); 00108 } 00109 00110 bool Failed() 00111 { 00112 return FAILED(m_hr); 00113 } 00114 private: 00115 00116 HRESULT m_hr; 00117 00118 }; 00119 #endif // _HRESULT_H__