From 8d850ac3414c8d040edf11a59a962b13961d3b27 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 20 Jun 2015 21:46:16 +0000 Subject: [PATCH] [SHELL32] - Fix assertion failure in 2nd stage by setting s_IsTerminated when an instance does not yet exist. - Rename CComCreatorSingleton to CComCreatorCentralInstance since it's not /technically/ a singleton svn path=/trunk/; revision=68215 --- .../dll/win32/shell32/folders/CDesktopFolder.h | 2 +- .../dll/win32/shell32/folders/CDrivesFolder.h | 2 +- reactos/dll/win32/shell32/shell32.cpp | 4 ++-- reactos/include/reactos/shellutils.h | 17 ++++++++++++----- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.h b/reactos/dll/win32/shell32/folders/CDesktopFolder.h index e1c6ad95f86..183d813b7a3 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.h +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.h @@ -79,7 +79,7 @@ class CDesktopFolder : virtual HRESULT WINAPI CopyItems(IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy); DECLARE_REGISTRY_RESOURCEID(IDR_SHELLDESKTOP) - DECLARE_SINGLETON_NOT_AGGREGATABLE(CDesktopFolder) + DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(CDesktopFolder) DECLARE_PROTECT_FINAL_CONSTRUCT() diff --git a/reactos/dll/win32/shell32/folders/CDrivesFolder.h b/reactos/dll/win32/shell32/folders/CDrivesFolder.h index fe6c6f84a28..d03dc6cf775 100644 --- a/reactos/dll/win32/shell32/folders/CDrivesFolder.h +++ b/reactos/dll/win32/shell32/folders/CDrivesFolder.h @@ -69,7 +69,7 @@ class CDrivesFolder : virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST * pidl); DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMPUTER) - DECLARE_SINGLETON_NOT_AGGREGATABLE(CDrivesFolder) + DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(CDrivesFolder) DECLARE_PROTECT_FINAL_CONSTRUCT() diff --git a/reactos/dll/win32/shell32/shell32.cpp b/reactos/dll/win32/shell32/shell32.cpp index 6a923c89e92..0192a6b0acf 100644 --- a/reactos/dll/win32/shell32/shell32.cpp +++ b/reactos/dll/win32/shell32/shell32.cpp @@ -151,8 +151,8 @@ class CShell32Module : public CComModule public: void Term() { - CComCreatorSingleton< ATL::CComObject< CDrivesFolder > >::Term(); - CComCreatorSingleton< ATL::CComObject< CDesktopFolder > >::Term(); + CComCreatorCentralInstance< ATL::CComObject< CDrivesFolder > >::Term(); + CComCreatorCentralInstance< ATL::CComObject< CDesktopFolder > >::Term(); CComModule::Term(); } }; diff --git a/reactos/include/reactos/shellutils.h b/reactos/include/reactos/shellutils.h index 56ad7fcf30b..cb122183d70 100644 --- a/reactos/include/reactos/shellutils.h +++ b/reactos/include/reactos/shellutils.h @@ -43,7 +43,7 @@ extern "C" { #ifdef __cplusplus template -class CComCreatorSingleton +class CComCreatorCentralInstance { private: static IUnknown *s_pInstance; @@ -59,11 +59,18 @@ public: { PVOID pObj; HRESULT hr; + s_IsTerminated = true; hr = ATL::CComCreator< T >::CreateInstance(NULL, IID_IUnknown, &pObj); if (FAILED(hr)) + { + s_IsTerminated = false; return hr; + } if (InterlockedCompareExchangePointer((PVOID *)&s_pInstance, pObj, NULL)) + { static_cast(pObj)->Release(); + s_IsTerminated = false; + } } return s_pInstance->QueryInterface(riid, ppv); } @@ -87,14 +94,14 @@ public: }; template -IUnknown *CComCreatorSingleton::s_pInstance = NULL; +IUnknown *CComCreatorCentralInstance::s_pInstance = NULL; template -bool CComCreatorSingleton::s_IsTerminated = false; +bool CComCreatorCentralInstance::s_IsTerminated = false; -#define DECLARE_SINGLETON_NOT_AGGREGATABLE(x) \ +#define DECLARE_CENTRAL_INSTANCE_NOT_AGGREGATABLE(x) \ public: \ - typedef CComCreatorSingleton< ATL::CComObject > _CreatorClass; + typedef CComCreatorCentralInstance< ATL::CComObject > _CreatorClass; #endif #ifdef __cplusplus