00001 /* ///////////////////////////////////////////////////////////////////////// 00002 * File: comstl/error/bad_interface_cast.hpp 00003 * 00004 * Purpose: Exception thrown when interface casts fail. 00005 * 00006 * Created: 22nd December 2003 00007 * Updated: 10th August 2009 00008 * 00009 * Home: http://stlsoft.org/ 00010 * 00011 * Copyright (c) 2003-2009, Matthew Wilson and Synesis Software 00012 * All rights reserved. 00013 * 00014 * Redistribution and use in source and binary forms, with or without 00015 * modification, are permitted provided that the following conditions are met: 00016 * 00017 * - Redistributions of source code must retain the above copyright notice, this 00018 * list of conditions and the following disclaimer. 00019 * - Redistributions in binary form must reproduce the above copyright notice, 00020 * this list of conditions and the following disclaimer in the documentation 00021 * and/or other materials provided with the distribution. 00022 * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of 00023 * any contributors may be used to endorse or promote products derived from 00024 * this software without specific prior written permission. 00025 * 00026 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00027 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00028 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00029 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00030 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00031 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00032 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00033 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00034 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00035 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00036 * POSSIBILITY OF SUCH DAMAGE. 00037 * 00038 * ////////////////////////////////////////////////////////////////////// */ 00039 00040 00047 #ifndef COMSTL_INCL_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST 00048 #define COMSTL_INCL_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST 00049 00050 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION 00051 # define COMSTL_VER_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST_MAJOR 5 00052 # define COMSTL_VER_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST_MINOR 0 00053 # define COMSTL_VER_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST_REVISION 3 00054 # define COMSTL_VER_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST_EDIT 38 00055 #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */ 00056 00057 /* ///////////////////////////////////////////////////////////////////////// 00058 * Includes 00059 */ 00060 00061 #ifndef COMSTL_INCL_COMSTL_H_COMSTL 00062 # include <comstl/comstl.h> 00063 #endif /* !COMSTL_INCL_COMSTL_H_COMSTL */ 00064 00065 #ifndef STLSOFT_CF_EXCEPTION_SUPPORT 00066 # error This file cannot be included when exception-handling is not supported 00067 #endif /* !STLSOFT_CF_EXCEPTION_SUPPORT */ 00068 00069 #ifndef STLSOFT_INCL_TYPEINFO 00070 # define STLSOFT_INCL_TYPEINFO 00071 # include <typeinfo> // for std::bad_cast 00072 #endif /* !STLSOFT_INCL_TYPEINFO */ 00073 00074 /* ///////////////////////////////////////////////////////////////////////// 00075 * Namespace 00076 */ 00077 00078 #ifndef _COMSTL_NO_NAMESPACE 00079 # if defined(_STLSOFT_NO_NAMESPACE) || \ 00080 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) 00081 /* There is no stlsoft namespace, so must define ::comstl */ 00082 namespace comstl 00083 { 00084 # else 00085 /* Define stlsoft::comstl_project */ 00086 00087 namespace stlsoft 00088 { 00089 00090 namespace comstl_project 00091 { 00092 00093 # endif /* _STLSOFT_NO_NAMESPACE */ 00094 #endif /* !_COMSTL_NO_NAMESPACE */ 00095 00096 /* ///////////////////////////////////////////////////////////////////////// 00097 * Classes 00098 */ 00099 00110 // [[synesis:class:exception: comstl::bad_cast]] 00111 class bad_interface_cast 00112 #if defined(STLSOFT_COMPILER_IS_DMC) 00113 : public std::bad_cast 00114 #else /* ? compiler */ 00115 : public comstl_ns_qual_std(bad_cast) 00116 #endif /* compiler */ 00117 { 00120 public: 00121 #if defined(STLSOFT_COMPILER_IS_DMC) 00122 typedef std::bad_cast parent_class_type; 00123 #else /* ? compiler */ 00124 typedef comstl_ns_qual_std(bad_cast) parent_class_type; 00125 #endif /* compiler */ 00126 typedef bad_interface_cast class_type; 00128 00131 public: 00134 bad_interface_cast(REFIID riid, HRESULT hr) stlsoft_throw_0() 00135 : parent_class_type() 00136 , m_riid(riid) 00137 , m_hr(hr) 00138 {} 00139 00141 #if defined(STLSOFT_COMPILER_IS_DMC) 00142 char const *what() const throw() 00143 #else /* ? compiler */ 00144 char const *what() const stlsoft_throw_0() 00145 #endif /* compiler */ 00146 { 00147 return "Failed to acquire requested interface"; 00148 } 00149 00151 REFIID iid() const stlsoft_throw_0() 00152 { 00153 return m_riid; 00154 } 00155 00159 HRESULT hresult() const stlsoft_throw_0() 00160 { 00161 return hr(); 00162 } 00163 00165 HRESULT hr() const stlsoft_throw_0() 00166 { 00167 return m_hr; 00168 } 00170 00173 private: 00174 IID m_riid; 00175 HRESULT const m_hr; 00177 00180 private: 00181 class_type& operator =(class_type const&); 00183 }; 00184 00185 /* ////////////////////////////////////////////////////////////////////// */ 00186 00187 #ifndef _COMSTL_NO_NAMESPACE 00188 # if defined(_STLSOFT_NO_NAMESPACE) || \ 00189 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) 00190 } // namespace comstl 00191 # else 00192 } // namespace comstl_project 00193 } // namespace stlsoft 00194 # endif /* _STLSOFT_NO_NAMESPACE */ 00195 #endif /* !_COMSTL_NO_NAMESPACE */ 00196 00197 /* ////////////////////////////////////////////////////////////////////// */ 00198 00199 #endif /* !COMSTL_INCL_COMSTL_ERROR_HPP_BAD_INTERFACE_CAST */ 00200 00201 /* ///////////////////////////// end of file //////////////////////////// */