From 820426939a6476e5f01007c8ec0576d2207a0efb Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Mon, 29 Aug 2016 12:29:45 +0000 Subject: [PATCH] [ATL][SHELL32] Add basic support for _ATL_NO_EXCEPTIONS in CString, use it in shell32 so that we can link without exception support. CORE-11841 #comment Please retest! svn path=/trunk/; revision=72499 --- reactos/dll/win32/shell32/CMakeLists.txt | 5 ++-- reactos/sdk/lib/atl/atlexcept.h | 38 ++++++++++++++++++++++++ reactos/sdk/lib/atl/atlsimpstr.h | 18 +++++++---- 3 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 reactos/sdk/lib/atl/atlexcept.h diff --git a/reactos/dll/win32/shell32/CMakeLists.txt b/reactos/dll/win32/shell32/CMakeLists.txt index 1a53a9e6300..7acb71fc144 100644 --- a/reactos/dll/win32/shell32/CMakeLists.txt +++ b/reactos/dll/win32/shell32/CMakeLists.txt @@ -4,7 +4,7 @@ add_subdirectory(shelldesktop) add_subdirectory(shellmenu) add_subdirectory(shellrecyclebin) -set_cpp(WITH_RUNTIME WITH_EXCEPTIONS) +set_cpp(WITH_RUNTIME) spec2def(shell32.dll shell32.spec ADD_IMPORTLIB) if(NOT MSVC) @@ -17,7 +17,8 @@ add_definitions(-D_WIN32_WINNT=0x600) add_definitions( -D_SHELL32_ - -D_WINE) + -D_WINE + -D_ATL_NO_EXCEPTIONS) include_directories( ${REACTOS_SOURCE_DIR}/sdk/lib/atl diff --git a/reactos/sdk/lib/atl/atlexcept.h b/reactos/sdk/lib/atl/atlexcept.h new file mode 100644 index 00000000000..b81c65519ea --- /dev/null +++ b/reactos/sdk/lib/atl/atlexcept.h @@ -0,0 +1,38 @@ + +#ifndef __ATLEXCEPT_H__ +#define __ATLEXCEPT_H__ + + +//FIXME: Enable when RaiseException is marked as NORETURN +//DECLSPEC_NORETURN +inline void AtlThrowImp(HRESULT hr) +{ +#ifdef ATLTRACE + ATLTRACE(hr); +#endif + +#ifdef _ATL_NO_EXCEPTIONS + + ATLASSERT(false); + + RaiseException( + hr == E_OUTOFMEMORY ? STATUS_NO_MEMORY : EXCEPTION_ILLEGAL_INSTRUCTION, + EXCEPTION_NONCONTINUABLE, 0, NULL + ); + +#else + + // FIXME: This is horribly wrong, we should implement CException! + throw; + +#endif + +} + + + +#ifndef AtlThrow +#define AtlThrow(x) AtlThrowImp(x) +#endif + +#endif diff --git a/reactos/sdk/lib/atl/atlsimpstr.h b/reactos/sdk/lib/atl/atlsimpstr.h index ea4434c9db2..1132e60d51a 100644 --- a/reactos/sdk/lib/atl/atlsimpstr.h +++ b/reactos/sdk/lib/atl/atlsimpstr.h @@ -4,7 +4,7 @@ #pragma once #include - +#include namespace ATL { @@ -485,7 +485,7 @@ private: CStringData* pNewData = pOldData->pStringMgr->Clone()->Allocate(nLength, sizeof(XCHAR)); if (pNewData == NULL) { - throw; // ThrowMemoryException(); + ThrowMemoryException(); } int nCharsToCopy = ((nOldLength < nLength) ? nOldLength : nLength) + 1; CopyChars(PXSTR(pNewData->data()), nCharsToCopy, @@ -550,7 +550,7 @@ private: CStringData* pNewData = pStringMgr->Reallocate(pOldData, nLength, sizeof(XCHAR)); if (pNewData == NULL) { - throw; // ThrowMemoryException(); + ThrowMemoryException(); } Attach(pNewData); @@ -562,7 +562,9 @@ private: ATLASSERT(nLength <= GetData()->nAllocLength); if (nLength < 0 || nLength > GetData()->nAllocLength) - throw; + { + AtlThrow(E_INVALIDARG); + } GetData()->nDataLength = nLength; m_pszData[nLength] = 0; @@ -583,7 +585,7 @@ private: pNewData = pNewStringMgr->Allocate(pData->nDataLength, sizeof(XCHAR)); if (pNewData == NULL) { - throw; // ThrowMemoryException(); + ThrowMemoryException(); } pNewData->nDataLength = pData->nDataLength; @@ -594,6 +596,12 @@ private: return pNewData; } + + static void ThrowMemoryException() + { + AtlThrow(E_OUTOFMEMORY); + } + }; }