[SHELLUTILS.H]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Fri, 14 Apr 2017 20:03:46 +0000 (20:03 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Fri, 14 Apr 2017 20:03:46 +0000 (20:03 +0000)
- Remove the ShellObjectCreator templates that allowed the caller to pass an arbitrary interface pointer. Leaving only the templates that take an void ** ppv parameter means that the callers are forced to use IID_PPV_ARG. This makes it less likely to have a pointer to an wrong interface.
- Fix the callers to always use IID_PPV_ARG.
- Rewrite the ShellObjectCreator templates to create the objects using the ATL CreateInstance thus allowing internal ATL methods to be called.

[BROWSEUI]
-Let CBandSite_CreateInstance take an additional parameter for the outer object since CBandSite is aggregatable. Create the object using the ATL creator class.

svn path=/trunk/; revision=74314

17 files changed:
reactos/base/shell/rshell/misc.cpp
reactos/base/shell/rshell/rshell.spec
reactos/dll/win32/browseui/shellbars/CBandSite.cpp
reactos/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp
reactos/dll/win32/shell32/CDefView.cpp
reactos/dll/win32/shell32/CEnumIDListBase.cpp
reactos/dll/win32/shell32/CIDLDataObj.cpp
reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
reactos/dll/win32/shell32/folders/CControlPanelFolder.h
reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
reactos/dll/win32/shell32/folders/CFSFolder.cpp
reactos/dll/win32/shell32/folders/CNetFolder.cpp
reactos/dll/win32/shell32/folders/CPrinterFolder.cpp
reactos/dll/win32/shell32/folders/CRecycleBin.cpp
reactos/dll/win32/shell32/shell32.cpp
reactos/sdk/include/reactos/shellutils.h

index 84087d3..de6fc00 100644 (file)
@@ -61,8 +61,6 @@ HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv);
 HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv);
 HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv);
 HRESULT WINAPI CMergedFolder_Constructor(REFIID riid, LPVOID *ppv);
-HRESULT WINAPI CBandSite_CreateInstance(REFIID riid, void **ppv);
-HRESULT WINAPI CBandSiteMenu_CreateInstance(REFIID riid, void **ppv);
 }
 
 DWORD WINAPI WinList_Init(void)
index 0d33b00..04e5eaa 100644 (file)
@@ -7,7 +7,7 @@
 @ stdcall CMenuSite_Constructor(ptr ptr);
 @ stdcall CMenuBand_Constructor(ptr ptr);
 @ stdcall CMergedFolder_Constructor(ptr ptr);
-@ stdcall CBandSite_CreateInstance(ptr ptr)
+@ stdcall CBandSite_CreateInstance(ptr ptr ptr)
 @ stdcall CBandSiteMenu_CreateInstance(ptr ptr)
 @ stdcall ShellDDEInit(long);
 @ stdcall SHCreateDesktop(ptr);
index f23e79d..efd3c99 100644 (file)
@@ -831,7 +831,7 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::SaveToStreamBS(IUnknown *, IStream *)
 }
 
 extern "C"
-HRESULT WINAPI CBandSite_CreateInstance(REFIID riid, void **ppv)
+HRESULT WINAPI CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv)
 {
-    return ShellObjectCreator<CBandSite>(riid, ppv);
+    return CBandSite::_CreatorClass::CreateInstance(pUnkOuter, riid, ppv);
 }
index d47236b..c2915a7 100644 (file)
@@ -327,8 +327,8 @@ extern "C" HRESULT WINAPI SHEnumClassesOfCategories(ULONG cImplemented, CATID *p
 {
     HRESULT hr;
 
-    hr = ShellObjectCreatorInit<CSHEnumClassesOfCategories, ULONG, CATID*, ULONG, CATID*, IEnumGUID>(
-            cImplemented, pImplemented, cRequired, pRequired, IID_IEnumGUID, out);
+    hr = ShellObjectCreatorInit<CSHEnumClassesOfCategories>(
+            cImplemented, pImplemented, cRequired, pRequired, IID_PPV_ARG(IEnumGUID, out));
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
     return S_OK;
index aa2f510..bc69b61 100644 (file)
@@ -3156,7 +3156,7 @@ HRESULT CDefView::_MergeToolbar()
  */
 HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView)
 {
-    return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
+    return ShellObjectCreatorInit<CDefView>(pFolder, IID_PPV_ARG(IShellView, newView));
 }
 
 HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
index 8e7a618..50facd5 100644 (file)
@@ -281,5 +281,5 @@ HRESULT WINAPI CEnumIDListBase::Clone(LPENUMIDLIST *ppenum)
  */
 HRESULT IEnumIDList_Constructor(IEnumIDList **enumerator)
 {
-    return ShellObjectCreator<CEnumIDListBase>(IID_IEnumIDList, enumerator);
+    return ShellObjectCreator<CEnumIDListBase>(IID_PPV_ARG(IEnumIDList, enumerator));
 }
index b11e65a..e381e1b 100644 (file)
@@ -129,7 +129,7 @@ HRESULT WINAPI IEnumFORMATETCImpl::Clone(LPENUMFORMATETC* ppenum)
 
 HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat)
 {
-    return ShellObjectCreatorInit<IEnumFORMATETCImpl>(cfmt, afmt, IID_IEnumFORMATETC, ppFormat);
+    return ShellObjectCreatorInit<IEnumFORMATETCImpl>(cfmt, afmt, IID_PPV_ARG(IEnumFORMATETC, ppFormat));
 }
 
 
@@ -410,7 +410,7 @@ HRESULT WINAPI CIDLDataObj::EndOperation(HRESULT hResult, IBindCtx *pbcReserved,
 */
 HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, IDataObject **dataObject)
 {
-    return ShellObjectCreatorInit<CIDLDataObj>(hwndOwner, pMyPidl, apidl, cidl, IID_IDataObject, dataObject);
+    return ShellObjectCreatorInit<CIDLDataObj>(hwndOwner, pMyPidl, apidl, cidl, IID_PPV_ARG(IDataObject, dataObject));
 }
 
 /*************************************************************************
index 6a0a79d..b95e32a 100644 (file)
@@ -311,7 +311,7 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName(
 */
 HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index dbef547..a4966a3 100644 (file)
@@ -96,7 +96,6 @@ public:
     CCPLItemMenu();
     ~CCPLItemMenu();
     HRESULT WINAPI Initialize(UINT cidl, PCUITEMID_CHILD_ARRAY apidl);
-    HRESULT WINAPI FinalConstruct();
 
     // IContextMenu
     virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
index 8d7b4eb..6ce397c 100644 (file)
@@ -441,7 +441,7 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName(
  */
 HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index 00c8107..5f0fa0a 100644 (file)
@@ -377,7 +377,7 @@ HRESULT WINAPI CDrivesFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLEST
 */
 HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index feb6f5a..10d4177 100644 (file)
@@ -253,7 +253,7 @@ HRESULT WINAPI CFSFolder::EnumObjects(
     DWORD dwFlags,
     LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index 9f7d016..17da04a 100644 (file)
@@ -274,7 +274,7 @@ HRESULT WINAPI CNetFolder::ParseDisplayName(HWND hwndOwner, LPBC pbcReserved, LP
 */
 HRESULT WINAPI CNetFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CNetFolderEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CNetFolderEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index c7df54f..5b19044 100644 (file)
@@ -226,7 +226,7 @@ static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl)
  */
 HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 /**************************************************************************
index ba80e3b..ba4d3c0 100644 (file)
@@ -488,7 +488,7 @@ UnpackDetailsFromPidl(LPCITEMIDLIST pidl)
 
 HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 {
-    return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_IEnumIDList, ppEnumIDList);
+    return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
 }
 
 HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv)
index 035a239..ea8af8a 100644 (file)
@@ -158,7 +158,7 @@ HRESULT WINAPI IDefClFImpl::LockServer(BOOL fLock)
 
 HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory)
 {
-    return ShellObjectCreatorInit<IDefClFImpl>(lpfnCI, pcRefDll, riidInst, IID_IClassFactory, theFactory);
+    return ShellObjectCreatorInit<IDefClFImpl>(lpfnCI, pcRefDll, riidInst, IID_PPV_ARG(IClassFactory, theFactory));
 }
 
 /******************************************************************************
index d89094f..1e8aa31 100644 (file)
@@ -213,273 +213,133 @@ HRESULT inline ShellDebugObjectCreator(REFIID riid, R ** ppv)
     return S_OK;
 }
 
-template<class T, class R>
-HRESULT inline ShellObjectCreator(REFIID riid, R ** ppv)
+template<class T>
+HRESULT inline ShellObjectCreator(REFIID riid, void ** ppv)
 {
-    CComPtr<T>       obj;
-    HRESULT          hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
-    return S_OK;
-}
 
-template<class T, class R>
-HRESULT inline ShellObjectCreatorInit(REFIID riid, R ** ppv)
-{
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
-    if (FAILED(hResult))
-        return hResult;
+    hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
 
-    hResult = obj->Initialize();
-    if (FAILED(hResult))
-        return hResult;
+    pobj->Release(); /* In case of failure the object will be released */
 
-    *ppv = result.Detach();
-
-    return S_OK;
+    return hResult;
 }
 
 template<class T>
 HRESULT inline ShellObjectCreatorInit(REFIID riid, void ** ppv)
 {
-    CComPtr<T>  obj;
-    CComPtr<IUnknown>  result;
-    HRESULT     hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
 
-    hResult = obj->Initialize();
-    if (FAILED(hResult))
-        return hResult;
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-    *ppv = result.Detach();
+    hResult = pobj->Initialize();
 
-    return S_OK;
+    if (SUCCEEDED(hResult))
+        hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
+
+    pobj->Release(); /* In case of failure the object will be released */
+
+    return hResult;
 }
 
 template<class T, class T1>
 HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, void ** ppv)
 {
-    CComPtr<T>  obj;
-    HRESULT     hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, ppv);
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
 
-    hResult = obj->Initialize(initArg1);
-    if (FAILED(hResult))
-        return hResult;
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-    return S_OK;
-}
+    hResult = pobj->Initialize(initArg1);
 
-template<class T, class T1, class T2>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, void ** ppv)
-{
-    CComPtr<T>  obj;
-    HRESULT     hResult;
+    if (SUCCEEDED(hResult))
+        hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, ppv);
-    if (FAILED(hResult))
-        return hResult;
+    pobj->Release(); /* In case of failure the object will be released */
 
-    hResult = obj->Initialize(initArg1, initArg2);
-    if (FAILED(hResult))
-        return hResult;
-
-    return S_OK;
+    return hResult;
 }
 
-template<class T, class T1, class T2, class T3>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, void ** ppv)
+template<class T, class T1, class T2>
+HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, void ** ppv)
 {
-    CComPtr<T>  obj;
-    HRESULT     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, ppv);
-    if (FAILED(hResult))
-        return hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    hResult = obj->Initialize(initArg1, initArg2, initArg3);
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
 
-    return S_OK;
-}
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-template<class T, class T1, class R>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, R ** ppv)
-{
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
+    hResult = pobj->Initialize(initArg1, initArg2);
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
-    if (FAILED(hResult))
-        return hResult;
-
-    hResult = obj->Initialize(initArg1);
-    if (FAILED(hResult))
-        return hResult;
+    if (SUCCEEDED(hResult))
+        hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
 
-    *ppv = result.Detach();
+    pobj->Release(); /* In case of failure the object will be released */
 
-    return S_OK;
+    return hResult;
 }
 
-template<class T, class T1, class T2, class R>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, R ** ppv)
+template<class T, class T1, class T2, class T3>
+HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, void ** ppv)
 {
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
-    if (FAILED(hResult))
-        return hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    hResult = obj->Initialize(initArg1, initArg2);
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
 
-    *ppv = result.Detach();
-
-    return S_OK;
-}
-
-template<class T, class T1, class T2, class T3, class R>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, R ** ppv)
-{
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
-    if (FAILED(hResult))
-        return hResult;
+    hResult = pobj->Initialize(initArg1, initArg2, initArg3);
 
-    hResult = obj->Initialize(initArg1, initArg2, initArg3);
-    if (FAILED(hResult))
-        return hResult;
+    if (SUCCEEDED(hResult))
+        hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
 
-    *ppv = result.Detach();
+    pobj->Release(); /* In case of failure the object will be released */
 
-    return S_OK;
+    return hResult;
 }
 
-template<class T, class T1, class T2, class T3, class T4, class R>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, R ** ppv)
+template<class T, class T1, class T2, class T3, class T4>
+HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, void ** ppv)
 {
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
+    _CComObject<T> *pobj;
+    HRESULT hResult;
 
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
+    hResult = _CComObject<T>::CreateInstance(&pobj);
     if (FAILED(hResult))
         return hResult;
 
-    hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4);
-    if (FAILED(hResult))
-        return hResult;
+    pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
 
-    *ppv = result.Detach();
+    hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4);
 
-    return S_OK;
-}
-
-template<class T, class T1, class T2, class T3, class T4, class T5, class R>
-HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5, REFIID riid, R ** ppv)
-{
-    CComPtr<T>  obj;
-    CComPtr<R>  result;
-    HRESULT     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(obj = new _CComObject<T>);
-    if (obj.p == NULL)
-        return E_OUTOFMEMORY;
-    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
-    if (FAILED(hResult))
-        return hResult;
+    if (SUCCEEDED(hResult))
+        hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
 
-    hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5);
-    if (FAILED(hResult))
-        return hResult;
+    pobj->Release(); /* In case of failure the object will be released */
 
-    *ppv = result.Detach();
-
-    return S_OK;
+    return hResult;
 }
 
 HRESULT inline SHSetStrRet(LPSTRRET pStrRet, LPCSTR pstrValue)