1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_ATL_THROW_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_ATL_THROW_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #ifdef __ATLDEF_H__ 9*6777b538SAndroid Build Coastguard Worker #error atl_throw.h must be included before atldef.h. 10*6777b538SAndroid Build Coastguard Worker #endif 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker // Defining _ATL_NO_EXCEPTIONS causes ATL to raise a structured exception 16*6777b538SAndroid Build Coastguard Worker // instead of throwing a CAtlException. While crashpad will eventually handle 17*6777b538SAndroid Build Coastguard Worker // this, the HRESULT that caused the problem is lost. So, in addition, define 18*6777b538SAndroid Build Coastguard Worker // our own custom AtlThrow function (_ATL_CUSTOM_THROW). 19*6777b538SAndroid Build Coastguard Worker #ifndef _ATL_NO_EXCEPTIONS 20*6777b538SAndroid Build Coastguard Worker #define _ATL_NO_EXCEPTIONS 21*6777b538SAndroid Build Coastguard Worker #endif 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker #define _ATL_CUSTOM_THROW 24*6777b538SAndroid Build Coastguard Worker #define AtlThrow ::base::win::AtlThrowImpl 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker namespace base { 27*6777b538SAndroid Build Coastguard Worker namespace win { 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Crash the process forthwith in case of ATL errors. 30*6777b538SAndroid Build Coastguard Worker [[noreturn]] BASE_EXPORT void __stdcall AtlThrowImpl(HRESULT hr); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker } // namespace win 33*6777b538SAndroid Build Coastguard Worker } // namespace base 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker #include <atldef.h> 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // atldef.h mistakenly leaves out the declaration of this function when 38*6777b538SAndroid Build Coastguard Worker // _ATL_CUSTOM_THROW is defined. 39*6777b538SAndroid Build Coastguard Worker namespace ATL { 40*6777b538SAndroid Build Coastguard Worker ATL_NOINLINE __declspec(noreturn) inline void WINAPI AtlThrowLastWin32(); 41*6777b538SAndroid Build Coastguard Worker } 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_ATL_THROW_H_ 44