Author: dquintana
Date: Mon Oct 20 21:09:55 2014
New Revision: 64854

URL: http://svn.reactos.org/svn/reactos?rev=64854&view=rev
Log:
[RSHELL]
[SHELL32]
[BROWSEUI]
* Move undocshell.h to a shared location, and move some shared utility 
functions into it.
* Replace all the COM object constructor functions with generic equivalents.
* Fixes a big bunch of "problems" found by Coverity Scan, but I don't have the 
list of CID at the moment.

Added:
    branches/shell-experiments/include/reactos/undocshell.h
      - copied, changed from r64853, 
branches/shell-experiments/dll/win32/shell32/undocshell.h
Removed:
    branches/shell-experiments/dll/win32/shell32/undocshell.h
Modified:
    branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
    branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp
    branches/shell-experiments/base/shell/rshell/CMenuSite.cpp
    branches/shell-experiments/base/shell/rshell/CMergedFolder.cpp
    branches/shell-experiments/base/shell/rshell/precomp.h
    branches/shell-experiments/dll/win32/browseui/addressband.cpp
    branches/shell-experiments/dll/win32/browseui/addresseditbox.cpp
    branches/shell-experiments/dll/win32/browseui/bandproxy.cpp
    branches/shell-experiments/dll/win32/browseui/basebar.cpp
    branches/shell-experiments/dll/win32/browseui/basebarsite.cpp
    branches/shell-experiments/dll/win32/browseui/brandband.cpp
    branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp
    branches/shell-experiments/dll/win32/browseui/precomp.h
    branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp
    branches/shell-experiments/dll/win32/browseui/toolsband.cpp
    branches/shell-experiments/dll/win32/browseui/travellog.cpp
    branches/shell-experiments/dll/win32/shell32/dataobject.cpp
    branches/shell-experiments/dll/win32/shell32/enumidlist.cpp
    branches/shell-experiments/dll/win32/shell32/extracticon.cpp
    branches/shell-experiments/dll/win32/shell32/folders/admintools.cpp
    branches/shell-experiments/dll/win32/shell32/folders/cpanel.cpp
    branches/shell-experiments/dll/win32/shell32/folders/desktop.cpp
    branches/shell-experiments/dll/win32/shell32/folders/fonts.cpp
    branches/shell-experiments/dll/win32/shell32/folders/fs.cpp
    branches/shell-experiments/dll/win32/shell32/folders/mycomp.cpp
    branches/shell-experiments/dll/win32/shell32/folders/mydocuments.cpp
    branches/shell-experiments/dll/win32/shell32/folders/printers.cpp
    branches/shell-experiments/dll/win32/shell32/folders/recyclebin.cpp
    branches/shell-experiments/dll/win32/shell32/openwithmenu.cpp
    branches/shell-experiments/dll/win32/shell32/precomp.h
    branches/shell-experiments/dll/win32/shell32/shellole.cpp
    branches/shell-experiments/dll/win32/shell32/shlview.cpp

Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMenuBand.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.cpp  [iso-8859-1] 
(original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.cpp  [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -35,27 +35,7 @@
 extern "C"
 HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
 {
-    HRESULT hr;
-#if USE_SYSTEM_MENUBAND
-    hr = CoCreateInstance(CLSID_MenuBand,
-        NULL,
-        CLSCTX_INPROC_SERVER,
-        riid, ppv);
-#else
-    *ppv = NULL;
-
-    CMenuBand * site = new CComObject<CMenuBand>();
-
-    if (!site)
-        return E_OUTOFMEMORY;
-
-    hr = site->QueryInterface(riid, ppv);
-
-    if (FAILED_UNEXPECTEDLY(hr))
-        delete site;
-#endif
-
-    return hr;
+    return ShellObjectCreator<CMenuBand>(riid, ppv);
 }
 
 CMenuBand::CMenuBand() :

Modified: branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp       
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuDeskBar.cpp       
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -30,27 +30,7 @@
 extern "C"
 HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
 {
-    HRESULT hr;
-#if USE_SYSTEM_MENUDESKBAR
-    hr = CoCreateInstance(CLSID_MenuDeskBar,
-        NULL,
-        CLSCTX_INPROC_SERVER,
-        riid, ppv);
-#else
-    *ppv = NULL;
-
-    CMenuDeskBar * deskbar = new CComObject<CMenuDeskBar>();
-
-    if (!deskbar)
-        return E_OUTOFMEMORY;
-
-    hr = deskbar->QueryInterface(riid, ppv);
-
-    if (FAILED_UNEXPECTEDLY(hr))
-        delete deskbar;
-
-#endif
-    return hr;
+    return ShellObjectCreator<CMenuDeskBar>(riid, ppv);
 }
 
 CMenuDeskBar::CMenuDeskBar() :

Modified: branches/shell-experiments/base/shell/rshell/CMenuSite.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMenuSite.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuSite.cpp  [iso-8859-1] 
(original)
+++ branches/shell-experiments/base/shell/rshell/CMenuSite.cpp  [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -28,27 +28,7 @@
 extern "C"
 HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
 {
-    HRESULT hr;
-#if USE_SYSTEM_MENUSITE
-    hr = CoCreateInstance(CLSID_MenuBandSite,
-        NULL,
-        CLSCTX_INPROC_SERVER,
-        riid, ppv);
-#else
-    *ppv = NULL;
-
-    CMenuSite * site = new CComObject<CMenuSite>();
-
-    if (!site)
-        return E_OUTOFMEMORY;
-
-    hr = site->QueryInterface(riid, ppv);
-
-    if (FAILED_UNEXPECTEDLY(hr))
-        delete site;
-#endif
-
-    return hr;
+    return ShellObjectCreator<CMenuSite>(riid, ppv);
 }
 
 CMenuSite::CMenuSite() :

Modified: branches/shell-experiments/base/shell/rshell/CMergedFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/CMergedFolder.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMergedFolder.cpp      
[iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMergedFolder.cpp      
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -356,20 +356,7 @@
 extern "C"
 HRESULT WINAPI CMergedFolder_Constructor(REFIID riid, LPVOID *ppv)
 {
-    *ppv = NULL;
-
-    CMergedFolder * fld = new CComObject<CMergedFolder>();
-
-    if (!fld)
-        return E_OUTOFMEMORY;
-
-    HRESULT hr;
-
-    hr = fld->QueryInterface(riid, ppv);
-    if (FAILED_UNEXPECTEDLY(hr))
-        delete fld;
-
-    return hr;
+    return ShellObjectCreator<CMergedFolder>(riid, ppv);
 }
 
 CMergedFolder::CMergedFolder() :

Modified: branches/shell-experiments/base/shell/rshell/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rshell/precomp.h?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/base/shell/rshell/precomp.h      [iso-8859-1] 
(original)
+++ branches/shell-experiments/base/shell/rshell/precomp.h      [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -53,6 +53,8 @@
 
 #include <atlbase.h>
 #include <atlcom.h>
+#include <undocshell.h>
+
 #include <wine/debug.h>
 
 #if _MSC_VER
@@ -73,115 +75,3 @@
 extern "C" HRESULT WINAPI CMenuBand_Wrapper(IShellMenu * sm, REFIID riid, 
LPVOID *ppv);
 extern "C" HRESULT WINAPI CMergedFolder_Constructor(REFIID riid, LPVOID *ppv);
 extern "C" HRESULT WINAPI CStartMenuSite_Wrapper(ITrayPriv * trayPriv, REFIID 
riid, LPVOID *ppv);
-
-static __inline ULONG
-Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
-{
-    char szMsg[512];
-    char *szMsgStart;
-    const char *fname;
-    va_list vl;
-    ULONG uRet;
-
-    fname = strrchr(filename, '\\');
-    if (fname == NULL)
-    {
-        fname = strrchr(filename, '/');
-    }
-
-    if (fname == NULL)
-        fname = filename;
-    else
-        fname++;
-
-    szMsgStart = szMsg + sprintf(szMsg, "[%10lu] %s:%d: ", GetTickCount(), 
fname, line);
-
-    va_start(vl, lpFormat);
-    uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl);
-    va_end(vl);
-
-    OutputDebugStringA(szMsg);
-
-    return uRet;
-}
-
-#define DbgPrint(fmt, ...) \
-    Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
-
-#if 1
-#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure 
%08x.\n", hr), TRUE))
-#else
-#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
-#endif
-
-
-template <class Base>
-class CComDebugObject : public Base
-{
-public:
-    CComDebugObject(void * = NULL)
-    {
-        _pAtlModule->Lock();
-    }
-
-    virtual ~CComDebugObject()
-    {
-        this->FinalRelease();
-        _pAtlModule->Unlock();
-    }
-
-    STDMETHOD_(ULONG, AddRef)()
-    {
-        int rc = this->InternalAddRef();
-        DbgPrint("RefCount is now %d(++)!\n", rc);
-        return rc;
-    }
-
-    STDMETHOD_(ULONG, Release)()
-    {
-        ULONG                                                          
newRefCount;
-
-        newRefCount = this->InternalRelease();
-        DbgPrint("RefCount is now %d(--)!\n", newRefCount);
-        if (newRefCount == 0)
-            delete this;
-        return newRefCount;
-    }
-
-    STDMETHOD(QueryInterface)(REFIID iid, void **ppvObject)
-    {
-        return this->_InternalQueryInterface(iid, ppvObject);
-    }
-
-    static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
-    {
-        CComDebugObject<Base>                          *newInstance;
-        HRESULT                                                                
hResult;
-
-        ATLASSERT(pp != NULL);
-        if (pp == NULL)
-            return E_POINTER;
-
-        hResult = E_OUTOFMEMORY;
-        newInstance = NULL;
-        ATLTRY(newInstance = new CComDebugObject<Base>())
-            if (newInstance != NULL)
-            {
-            newInstance->SetVoid(NULL);
-            newInstance->InternalFinalConstructAddRef();
-            hResult = newInstance->_AtlInitialConstruct();
-            if (SUCCEEDED(hResult))
-                hResult = newInstance->FinalConstruct();
-            if (SUCCEEDED(hResult))
-                hResult = newInstance->_AtlFinalConstruct();
-            newInstance->InternalFinalConstructRelease();
-            if (hResult != S_OK)
-            {
-                delete newInstance;
-                newInstance = NULL;
-            }
-            }
-        *pp = newInstance;
-        return hResult;
-    }
-};

Modified: branches/shell-experiments/dll/win32/browseui/addressband.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/addressband.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/addressband.cpp       
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/browseui/addressband.cpp       
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -668,20 +668,5 @@
 
 HRESULT CreateAddressBand(REFIID riid, void **ppv)
 {
-    CAddressBand                *theMenuBar;
-    HRESULT                     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theMenuBar = new CComObject<CAddressBand>);
-    if (theMenuBar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theMenuBar->QueryInterface(riid, reinterpret_cast<void **>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theMenuBar;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CAddressBand>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/addresseditbox.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/addresseditbox.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/addresseditbox.cpp    
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/browseui/addresseditbox.cpp    
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -283,20 +283,5 @@
 
 HRESULT CreateAddressEditBox(REFIID riid, void **ppv)
 {
-    CComObject<CAddressEditBox>             *theMenuBar;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theMenuBar = new CComObject<CAddressEditBox>);
-    if (theMenuBar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theMenuBar->QueryInterface(riid, reinterpret_cast<void **>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theMenuBar;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CAddressEditBox>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/bandproxy.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/bandproxy.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/bandproxy.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/bandproxy.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -133,20 +133,5 @@
 
 HRESULT CreateBandProxy(REFIID riid, void **ppv)
 {
-    CComObject<CBandProxy>                  *theBandProxy;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theBandProxy = new CComObject<CBandProxy>);
-    if (theBandProxy == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theBandProxy->QueryInterface(riid, reinterpret_cast<void 
**>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theBandProxy;
-        return hResult;
-    }
-    return S_OK;
+    return ShellObjectCreator<CBandProxy>(riid, ppv);
 }

Modified: branches/shell-experiments/dll/win32/browseui/basebar.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/basebar.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/basebar.cpp   [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/basebar.cpp   [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -514,20 +514,5 @@
 
 HRESULT CreateBaseBar(REFIID riid, void **ppv)
 {
-    CComObject<CBaseBar>                    *theBaseBar;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theBaseBar = new CComObject<CBaseBar>);
-    if (theBaseBar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theBaseBar->QueryInterface (riid, reinterpret_cast<void 
**>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theBaseBar;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CBaseBar>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/basebarsite.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/basebarsite.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/basebarsite.cpp       
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/browseui/basebarsite.cpp       
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -477,20 +477,5 @@
 
 HRESULT CreateBaseBarSite(REFIID riid, void **ppv)
 {
-    CComObject<CBaseBarSite>                *theBaseBarSite;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theBaseBarSite = new CComObject<CBaseBarSite>);
-    if (theBaseBarSite == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theBaseBarSite->QueryInterface(riid, reinterpret_cast<void 
**>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theBaseBarSite;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CBaseBarSite>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/brandband.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/brandband.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/brandband.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/brandband.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -470,20 +470,5 @@
 
 HRESULT CreateBrandBand(REFIID riid, void **ppv)
 {
-    CComObject<CBrandBand>                  *theMenuBar;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theMenuBar = new CComObject<CBrandBand>);
-    if (theMenuBar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theMenuBar->QueryInterface(riid, reinterpret_cast<void **>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theMenuBar;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CBrandBand>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp   
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp   
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -437,7 +437,11 @@
     CComPtr<IShellFolder> psfCommonFavorites;
     CComPtr<IAugmentedShellFolder> pasf;
 
-    *ppsfFavorites = NULL;
+    if (ppsfFavorites)
+        *ppsfFavorites = NULL;
+    
+    if (ppidl)
+        *ppidl = NULL;
 
     hr = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlUserFavorites);
     if (FAILED(hr))
@@ -498,6 +502,8 @@
 
     hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfFavorites));
     pasf.Release();
+
+    // TODO: obtain the folder's PIDL
 
     ILFree(pidlCommonFavorites);
     ILFree(pidlUserFavorites);
@@ -578,7 +584,8 @@
             return hResult;
 
         hResult = newMenu->SetShellFolder(favoritesFolder, favoritesPIDL, 
orderRegKey, SMSET_BOTTOM | SMINIT_CACHED | SMINV_ID);
-        ILFree(favoritesPIDL);
+        if (favoritesPIDL)
+            ILFree(favoritesPIDL);
         if (SUCCEEDED(hResult))
             fFavoritesMenu.Attach(newMenu.Detach());
     }
@@ -1989,20 +1996,5 @@
 
 HRESULT CreateInternetToolbar(REFIID riid, void **ppv)
 {
-    CInternetToolbar            *theToolbar;
-    HRESULT                     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theToolbar = new CComObject<CInternetToolbar>);
-    if (theToolbar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theToolbar->QueryInterface (riid, reinterpret_cast<void 
**>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theToolbar;
-        return hResult;
-    }
-    return S_OK;
-}
+    return ShellObjectCreator<CInternetToolbar>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/browseui/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/precomp.h?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/precomp.h     [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/precomp.h     [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -23,6 +23,7 @@
 #include <exdispid.h>
 #include <shlwapi.h>
 #include <shlwapi_undoc.h>
+#include <undocshell.h>
 #include <wine/debug.h>
 
 #include "resource.h"
@@ -40,161 +41,6 @@
 #include "regtreeoptions.h"
 #include <stdio.h>
 
-static __inline ULONG
-Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
-{
-    char szMsg[512];
-    char *szMsgStart;
-    const char *fname;
-    va_list vl;
-    ULONG uRet;
-
-    fname = strrchr(filename, '\\');
-    if (fname == NULL)
-    {
-        fname = strrchr(filename, '/');
-        if (fname != NULL)
-            fname++;
-    }
-    else
-        fname++;
-
-    if (fname == NULL)
-        fname = filename;
-
-    szMsgStart = szMsg + sprintf(szMsg, "%s:%d: ", fname, line);
-
-    va_start(vl, lpFormat);
-    uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl);
-    va_end(vl);
-
-    OutputDebugStringA(szMsg);
-
-    return uRet;
-}
-
-#define DbgPrint(fmt, ...) \
-    Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
-
-static void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel)
-{
-    WCHAR label[128];
-
-    padding[padlevel] = '.';
-    padding[padlevel + 1] = '.';
-    padding[padlevel + 2] = 0;
-
-    int count = GetMenuItemCount(hmenu);
-    for (int i = 0; i < count; i++)
-    {
-        MENUITEMINFOW mii = { 0 };
-
-        mii.cbSize = sizeof(mii);
-        mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | 
MIIM_ID;
-        mii.dwTypeData = label;
-        mii.cch = _countof(label);
-
-        GetMenuItemInfo(hmenu, i, TRUE, &mii);
-
-        if (mii.fType & MFT_BITMAP)
-            DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", 
padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
-        else if (mii.fType & MFT_SEPARATOR)
-            DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID);
-        else
-            DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, 
i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
-
-        if (mii.hSubMenu)
-            DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2);
-
-    }
-
-    padding[padlevel] = 0;
-}
-
-static __inline void DbgDumpMenu(HMENU hmenu)
-{
-    char padding[128];
-    DbgDumpMenuInternal(hmenu, padding, 0);
-}
-
-#if 1
-#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure 
%08x.\n", hr), TRUE))
-#else
-#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
-#endif
-
-
-template <class Base>
-class CComDebugObject : public Base
-{
-public:
-    CComDebugObject(void * = NULL)
-    {
-        _pAtlModule->Lock();
-    }
-
-    virtual ~CComDebugObject()
-    {
-        this->FinalRelease();
-        _pAtlModule->Unlock();
-    }
-
-    STDMETHOD_(ULONG, AddRef)()
-    {
-        int rc = this->InternalAddRef();
-        DbgPrint("RefCount is now %d(++)!\n", rc);
-        return rc;
-    }
-
-    STDMETHOD_(ULONG, Release)()
-    {
-        ULONG                                                          
newRefCount;
-
-        newRefCount = this->InternalRelease();
-        DbgPrint("RefCount is now %d(--)!\n", newRefCount);
-        if (newRefCount == 0)
-            delete this;
-        return newRefCount;
-    }
-
-    STDMETHOD(QueryInterface)(REFIID iid, void **ppvObject)
-    {
-        return this->_InternalQueryInterface(iid, ppvObject);
-    }
-
-    static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
-    {
-        CComDebugObject<Base>                          *newInstance;
-        HRESULT                                                                
hResult;
-
-        ATLASSERT(pp != NULL);
-        if (pp == NULL)
-            return E_POINTER;
-
-        hResult = E_OUTOFMEMORY;
-        newInstance = NULL;
-        ATLTRY(newInstance = new CComDebugObject<Base>())
-            if (newInstance != NULL)
-            {
-            newInstance->SetVoid(NULL);
-            newInstance->InternalFinalConstructAddRef();
-            hResult = newInstance->_AtlInitialConstruct();
-            if (SUCCEEDED(hResult))
-                hResult = newInstance->FinalConstruct();
-            if (SUCCEEDED(hResult))
-                hResult = newInstance->_AtlFinalConstruct();
-            newInstance->InternalFinalConstructRelease();
-            if (hResult != S_OK)
-            {
-                delete newInstance;
-                newInstance = NULL;
-            }
-            }
-        *pp = newInstance;
-        return hResult;
-    }
-};
-
 WINE_DEFAULT_DEBUG_CHANNEL(browseui);
 
 #endif /* _BROWSEUI_PCH_ */

Modified: branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp      
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp      
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -3431,15 +3431,11 @@
             DispatchMessage(&Msg);
         }
     }
-    
-    //TerminateProcess(GetCurrentProcess(), hResult);
 
     int nrc = theCabinet->Release();
     if (nrc > 0)
     {
-        DbgPrint("WARNING: There are %d references to the CShellBrowser active 
or leaked, process will never terminate. Terminating forcefully.\n", nrc);
-
-        //TerminateProcess(GetCurrentProcess(), 1);
+        DbgPrint("WARNING: There are %d references to the CShellBrowser active 
or leaked.\n", nrc);
     }
 
     theCabinet.Detach();

Modified: branches/shell-experiments/dll/win32/browseui/toolsband.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/toolsband.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/toolsband.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/toolsband.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -313,15 +313,11 @@
         BITMAP bitmapInfo;
         GetObjectW(imgNormal, sizeof(bitmapInfo), &bitmapInfo);
         HIMAGELIST himlNormal = ImageList_Create(bitmapInfo.bmHeight, 
bitmapInfo.bmHeight, ILC_COLOR32, 4, 4);
-
         ImageList_Add(himlNormal, imgNormal, NULL);
-        DeleteObject(imgNormal);
 
         GetObjectW(imgHot, sizeof(bitmapInfo), &bitmapInfo);
         HIMAGELIST himlHot = ImageList_Create(bitmapInfo.bmHeight, 
bitmapInfo.bmHeight, ILC_COLOR32, 4, 4);
-
         ImageList_Add(himlHot, imgHot, NULL);
-        DeleteObject(imgHot);
 
         SendMessage(TB_SETIMAGELIST, 0, (LPARAM) himlNormal);
         SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM) himlHot);
@@ -329,6 +325,11 @@
 
     SendMessage(TB_ADDBUTTONSW, numShownButtons, (LPARAM)&tbButtonsAdd);
 
+    if (imgNormal)
+        DeleteObject(imgNormal);
+    if (imgHot)
+        DeleteObject(imgHot);
+    
     return hResult;
 }
 
@@ -440,21 +441,6 @@
 
 HRESULT CreateToolsBar(REFIID riid, void **ppv)
 {
-    CToolsBand                  *theToolbar;
-    HRESULT                     hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(theToolbar = new CComObject<CToolsBand>);
-    if (theToolbar == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theToolbar->QueryInterface(riid, reinterpret_cast<void **>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theToolbar;
-        return hResult;
-    }
-    return S_OK;
-}
-
+    return ShellObjectCreator<CToolsBand>(riid, ppv);
+}
+

Modified: branches/shell-experiments/dll/win32/browseui/travellog.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/browseui/travellog.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/travellog.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/browseui/travellog.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -621,23 +621,5 @@
 
 HRESULT CreateTravelLog(REFIID riid, void **ppv)
 {
-    CComObject<CTravelLog>                  *theTravelLog;
-    HRESULT                                 hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theTravelLog = new CComObject<CTravelLog>);
-    if (theTravelLog == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theTravelLog->QueryInterface(riid, reinterpret_cast<void 
**>(ppv));
-    if (FAILED_UNEXPECTEDLY(hResult))
-    {
-        delete theTravelLog;
-        return hResult;
-    }
-    hResult = theTravelLog->Initialize();
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
-    return S_OK;
-}
+    return ShellObjectCreatorInit<CTravelLog>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/shell32/dataobject.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/dataobject.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/dataobject.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/dataobject.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -127,30 +127,9 @@
     return (*ppenum)->Skip(posFmt);
 }
 
-HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], 
IEnumFORMATETC **enumerator)
-{
-    CComObject<IEnumFORMATETCImpl>            *theEnumerator;
-    CComPtr<IEnumFORMATETC>                    result;
-    HRESULT                                    hResult;
-
-    if (enumerator == NULL)
-        return E_POINTER;
-    *enumerator = NULL;
-    ATLTRY (theEnumerator = new CComObject<IEnumFORMATETCImpl>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface (IID_PPV_ARG(IEnumFORMATETC, 
&result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (cfmt, afmt);
-    if (FAILED (hResult))
-        return hResult;
-    *enumerator = result.Detach ();
-    TRACE("(%p)->(%u,%p)\n", *enumerator, cfmt, afmt);
-    return S_OK;
+HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], 
IEnumFORMATETC **ppFormat)
+{
+    return ShellObjectCreatorInit<IEnumFORMATETCImpl>(cfmt, afmt, 
IID_IEnumFORMATETC, ppFormat);
 }
 
 
@@ -416,28 +395,7 @@
 */
 HRESULT IDataObject_Constructor(HWND hwndOwner, LPCITEMIDLIST pMyPidl, 
LPCITEMIDLIST * apidl, UINT cidl, IDataObject **dataObject)
 {
-    CComObject<IDataObjectImpl>                *theDataObject;
-    CComPtr<IDataObject>                    result;
-    HRESULT                                    hResult;
-
-    if (dataObject == NULL)
-        return E_POINTER;
-    *dataObject = NULL;
-    ATLTRY (theDataObject = new CComObject<IDataObjectImpl>);
-    if (theDataObject == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theDataObject->QueryInterface(IID_PPV_ARG(IDataObject, &result));
-    if (FAILED (hResult))
-    {
-        delete theDataObject;
-        return hResult;
-    }
-    hResult = theDataObject->Initialize (hwndOwner, pMyPidl, apidl, cidl);
-    if (FAILED (hResult))
-        return hResult;
-    *dataObject = result.Detach ();
-    TRACE("(%p)->(apidl=%p cidl=%u)\n", *dataObject,  apidl, cidl);
-    return S_OK;
+    return ShellObjectCreatorInit<IDataObjectImpl>(hwndOwner, pMyPidl, apidl, 
cidl, IID_IDataObject, dataObject);
 }
 
 /*************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/enumidlist.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/enumidlist.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/enumidlist.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/enumidlist.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -281,22 +281,5 @@
  */
 HRESULT IEnumIDList_Constructor(IEnumIDList **enumerator)
 {
-    CComObject<IEnumIDListImpl>                *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    if (enumerator == NULL)
-        return E_POINTER;
-    *enumerator = NULL;
-    ATLTRY (theEnumerator = new CComObject<IEnumIDListImpl>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    *enumerator = result.Detach ();
-    return S_OK;
-}
+    return ShellObjectCreator<IEnumIDListImpl>(IID_IEnumIDList, enumerator);
+}

Modified: branches/shell-experiments/dll/win32/shell32/extracticon.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/extracticon.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/extracticon.cpp        
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/extracticon.cpp        
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -337,22 +337,5 @@
 
 HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
 {
-    CComObject<IconExtraction>                *theExtractor;
-    CComPtr<IUnknown>                        result;
-    HRESULT                                    hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theExtractor = new CComObject<IconExtraction>);
-    if (theExtractor == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theExtractor->QueryInterface (riid, (void **)&result);
-    if (FAILED (hResult))
-    {
-        delete theExtractor;
-        return hResult;
-    }
-    *ppv = result.Detach ();
-    return S_OK;
-}
+    return ShellObjectCreator<IconExtraction>(riid, ppv);
+}

Modified: branches/shell-experiments/dll/win32/shell32/folders/admintools.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/admintools.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/admintools.cpp 
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/admintools.cpp 
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -136,32 +136,7 @@
  */
 HRESULT WINAPI CAdminToolsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CDesktopFolderEnumY>        *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                 hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CDesktopFolderEnumY>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (szTarget, dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach ();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CDesktopFolderEnumY>(szTarget, dwFlags, 
IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/cpanel.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/cpanel.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/cpanel.cpp     
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/cpanel.cpp     
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -371,37 +371,9 @@
 /**************************************************************************
 *        CControlPanelFolder::EnumObjects
 */
-HRESULT WINAPI CControlPanelFolder::EnumObjects(
-    HWND hwndOwner,
-    DWORD dwFlags,
-    LPENUMIDLIST *ppEnumIDList)
-{
-    CComObject<CControlPanelEnum>            *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CControlPanelEnum>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach ();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
+{
+    return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_IEnumIDList, 
ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/desktop.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/desktop.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/desktop.cpp    
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/desktop.cpp    
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -421,41 +421,9 @@
 /**************************************************************************
  *        CDesktopFolder::EnumObjects
  */
-HRESULT WINAPI CDesktopFolder::EnumObjects(
-    HWND hwndOwner,
-    DWORD dwFlags,
-    LPENUMIDLIST *ppEnumIDList)
-{
-    CComObject<CDesktopFolderEnum>            *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-
-    ATLTRY (theEnumerator = new CComObject<CDesktopFolderEnum>);
-
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-
-    hResult = theEnumerator->Initialize (this, hwndOwner, dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach ();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
+{
+    return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, 
dwFlags, IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/fonts.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/fonts.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/fonts.cpp      
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/fonts.cpp      
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -219,32 +219,7 @@
 */
 HRESULT WINAPI CFontsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CDesktopFolderEnumZ>            *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CDesktopFolderEnumZ>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach ();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CDesktopFolderEnumZ>(dwFlags, 
IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/fs.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/fs.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/fs.cpp [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/folders/fs.cpp [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -260,32 +260,7 @@
     DWORD dwFlags,
     LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CFileSysEnum> *theEnumerator;
-    CComPtr<IEnumIDList>      result;
-    HRESULT                   hResult;
-
-    TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CFileSysEnum>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED(hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (sPathTarget, dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, 
IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/mycomp.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/mycomp.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/mycomp.cpp     
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/mycomp.cpp     
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -252,36 +252,7 @@
 */
 HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CDrivesFolderEnum> *theEnumerator;
-    CComPtr<IEnumIDList>          result;
-    HRESULT                       hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-
-    *ppEnumIDList = NULL;
-    ATLTRY(theEnumerator = new CComObject<CDrivesFolderEnum>);
-
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-
-    hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result);
-    if (FAILED(hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-
-    hResult = theEnumerator->Initialize(hwndOwner, dwFlags);
-    if (FAILED(hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, 
IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/mydocuments.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/mydocuments.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/mydocuments.cpp        
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/mydocuments.cpp        
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -214,32 +214,7 @@
  */
 HRESULT WINAPI CMyDocsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CFileSysEnumX>                *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CFileSysEnumX>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result);
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize(dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CFileSysEnumX>(dwFlags, IID_IEnumIDList, 
ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/printers.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/printers.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/printers.cpp   
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/printers.cpp   
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -185,27 +185,7 @@
  */
 static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID 
riid, IUnknown **ppv)
 {
-    CComObject<CPrintersExtractIconW> *theExtractor;
-    CComPtr<IUnknown>                 result;
-    HRESULT                           hResult;
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY (theExtractor = new CComObject<CPrintersExtractIconW>);
-    if (theExtractor == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theExtractor->QueryInterface(riid, (void **)&result);
-    if (FAILED (hResult))
-    {
-        delete theExtractor;
-        return hResult;
-    }
-    hResult = theExtractor->Initialize(pidl);
-    if (FAILED (hResult))
-        return hResult;
-    *ppv = result.Detach();
-    return S_OK;
+    return ShellObjectCreatorInit<CPrintersExtractIconW>(pidl, riid, ppv);
 }
 
 /***********************************************************************
@@ -379,32 +359,7 @@
  */
 HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST * ppEnumIDList)
 {
-    CComObject<CPrintersEnum> *theEnumerator;
-    CComPtr<IEnumIDList>      result;
-    HRESULT                   hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CPrintersEnum>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize(hwndOwner, dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, 
IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/folders/recyclebin.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/folders/recyclebin.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/folders/recyclebin.cpp 
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/folders/recyclebin.cpp 
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -403,34 +403,6 @@
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI CRecycleBinItemContextMenuConstructor(REFIID riid, 
LPCITEMIDLIST pidl, LPVOID *ppv)
-{
-    CComObject<CRecycleBinItemContextMenu>    *theMenu;
-    CComPtr<IUnknown>                        result;
-    HRESULT                                    hResult;
-
-    TRACE("%s\n", shdebugstr_guid(&riid));
-
-    if (ppv == NULL)
-        return E_POINTER;
-    *ppv = NULL;
-    ATLTRY(theMenu = new CComObject<CRecycleBinItemContextMenu>);
-    if (theMenu == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theMenu->QueryInterface(riid, (void **)&result);
-    if (FAILED(hResult))
-    {
-        delete theMenu;
-        return hResult;
-    }
-    hResult = theMenu->Initialize(pidl);
-    if (FAILED(hResult))
-        return hResult;
-    *ppv = result.Detach();
-    TRACE ("--(%p)\n", *ppv);
-    return S_OK;
-}
-
 /**************************************************************************
 * registers clipboardformat once
 */
@@ -509,32 +481,7 @@
 
 HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CRecycleBinEnum>                *theEnumerator;
-    CComPtr<IEnumIDList>                    result;
-    HRESULT                                    hResult;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, 
dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CRecycleBinEnum>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED (hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize(dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_IEnumIDList, 
ppEnumIDList);
 }
 
 HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, 
REFIID riid, void **ppv)
@@ -617,12 +564,12 @@
 
     if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, 
IID_IContextMenu2)) && (cidl >= 1))
     {
-        hr = CRecycleBinItemContextMenuConstructor(riid, apidl[0], (void 
**)&pObj);
+        hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(apidl[0], 
riid, &pObj);
     }
     else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
     {
         IDropTarget * pDt = NULL;
-        hr = this->QueryInterface(IID_PPV_ARG(IDropTarget, &pDt));
+        hr = QueryInterface(IID_PPV_ARG(IDropTarget, &pDt));
         pObj = pDt;
     }
     else

Modified: branches/shell-experiments/dll/win32/shell32/openwithmenu.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/openwithmenu.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/openwithmenu.cpp       
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/shell32/openwithmenu.cpp       
[iso-8859-1] Mon Oct 20 21:09:55 2014
@@ -1376,7 +1376,6 @@
 {
     MSG msg;
     HWND hwnd;
-    COpenWithDialog *pDialog;
 
     TRACE("SHOpenWithDialog hwndParent %p poainfo %p\n", hwndParent, poainfo);
 
@@ -1385,11 +1384,9 @@
     if (poainfo->pcszClass == NULL && poainfo->pcszFile == NULL)
         return E_FAIL;
 
-    pDialog = new COpenWithDialog(poainfo);
-    if (!pDialog)
-        return E_OUTOFMEMORY;
-
-    hwnd = CreateDialogParam(shell32_hInstance, 
MAKEINTRESOURCE(IDD_OPEN_WITH), hwndParent, COpenWithDialog::DialogProc, 
(LPARAM)pDialog);
+    COpenWithDialog pDialog(poainfo);
+
+    hwnd = CreateDialogParam(shell32_hInstance, 
MAKEINTRESOURCE(IDD_OPEN_WITH), hwndParent, COpenWithDialog::DialogProc, 
(LPARAM)&pDialog);
     if (hwnd == NULL)
     {
         ERR("Failed to create dialog\n");
@@ -1407,7 +1404,5 @@
         }
     }
 
-    delete pDialog;
-
     return S_OK;
 }

Modified: branches/shell-experiments/dll/win32/shell32/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/precomp.h?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/precomp.h      [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/precomp.h      [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -30,6 +30,7 @@
 #include <atlbase.h>
 #include <atlcom.h>
 #include <powrprof.h>
+#include <undocshell.h>
 
 //#include "base/shell/explorer-new/todo.h"
 //#include "dlgs.h"

Modified: branches/shell-experiments/dll/win32/shell32/shellole.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/shellole.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/shellole.cpp   [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/shellole.cpp   [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -376,27 +376,7 @@
 
 HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const 
IID *riidInst, IClassFactory **theFactory)
 {
-    CComObject<IDefClFImpl>                    *theClassObject;
-    CComPtr<IClassFactory>                    result;
-    HRESULT                                    hResult;
-
-    if (theFactory == NULL)
-        return E_POINTER;
-    *theFactory = NULL;
-    ATLTRY (theClassObject = new CComObject<IDefClFImpl>);
-    if (theClassObject == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theClassObject->QueryInterface (IID_PPV_ARG(IClassFactory, 
&result));
-    if (FAILED (hResult))
-    {
-        delete theClassObject;
-        return hResult;
-    }
-    hResult = theClassObject->Initialize (lpfnCI, pcRefDll, riidInst);
-    if (FAILED (hResult))
-        return hResult;
-    *theFactory = result.Detach ();
-    return S_OK;
+    return ShellObjectCreatorInit<IDefClFImpl>(lpfnCI, pcRefDll, riidInst, 
IID_IClassFactory, theFactory);
 }
 
 /******************************************************************************

Modified: branches/shell-experiments/dll/win32/shell32/shlview.cpp
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/shlview.cpp?rev=64854&r1=64853&r2=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/shlview.cpp    [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/shlview.cpp    [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -2974,30 +2974,5 @@
  */
 HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView 
**newView)
 {
-    CComObject<CDefView>                    *theView;
-    CComPtr<IShellView>                        result;
-    HRESULT                                    hResult;
-
-    if (newView == NULL)
-        return E_POINTER;
-
-    *newView = NULL;
-    ATLTRY (theView = new CComObject<CDefView>);
-
-    if (theView == NULL)
-        return E_OUTOFMEMORY;
-
-    hResult = theView->QueryInterface(IID_PPV_ARG(IShellView, &result));
-    if (FAILED (hResult))
-    {
-        delete theView;
-        return hResult;
-    }
-
-    hResult = theView->Initialize (pFolder);
-    if (FAILED (hResult))
-        return hResult;
-    *newView = result.Detach ();
-
-    return S_OK;
-}
+    return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
+}

Removed: branches/shell-experiments/dll/win32/shell32/undocshell.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/shell32/undocshell.h?rev=64853
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/undocshell.h   [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/shell32/undocshell.h   (removed)
@@ -1,536 +0,0 @@
-/*
- * Copyright 1999, 2000 Juergen Schmied
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#ifndef __WINE_UNDOCSHELL_H
-#define __WINE_UNDOCSHELL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* defined(__cplusplus) */
-
-/****************************************************************************
- *     IDList Functions
- */
-BOOL WINAPI ILGetDisplayName(
-       LPCITEMIDLIST pidl,
-       LPVOID path);
-
-/* type parameter for ILGetDisplayNameEx() */
-#define ILGDN_FORPARSING  0
-#define ILGDN_NORMAL      1
-#define ILGDN_INFOLDER    2
-
-BOOL WINAPI ILGetDisplayNameEx(
-       LPSHELLFOLDER psf,
-       LPCITEMIDLIST pidl,
-       LPVOID path,
-       DWORD type);
-
-LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl);
-void WINAPI ILGlobalFree(LPITEMIDLIST pidl);
-LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath); //FIXME
-LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath);
-
-HRESULT WINAPI SHILCreateFromPathA (
-       LPCSTR path,
-       LPITEMIDLIST * ppidl,
-       DWORD *attributes);
-
-HRESULT WINAPI SHILCreateFromPathW (
-       LPCWSTR path,
-       LPITEMIDLIST * ppidl,
-       DWORD *attributes);
-
-/*
-       string functions
-*/
-BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
-BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
-
-
-/****************************************************************************
-* SHChangeNotifyRegister API
-*/
-#define SHCNRF_InterruptLevel          0x0001
-#define SHCNRF_ShellLevel              0x0002
-#define SHCNRF_RecursiveInterrupt      0x1000  /* Must be combined with 
SHCNRF_InterruptLevel */
-#define SHCNRF_NewDelivery             0x8000  /* Messages use shared memory */
-
-
-/****************************************************************************
- * Shell Common Dialogs
- */
-
-/* RunFileDlg flags */
-#define RFF_NOBROWSE       0x01
-#define RFF_NODEFAULT      0x02
-#define RFF_CALCDIRECTORY  0x04
-#define RFF_NOLABEL        0x08
-#define RFF_NOSEPARATEMEM  0x20  /* NT only */
-
-#define DE_SAMEFILE 0x71
-
-/* RunFileFlg notification structure */
-typedef struct
-{
-  NMHDR   hdr;
-  LPCSTR  lpFile;
-  LPCSTR  lpDirectory;
-  int     nShow;
-} NM_RUNFILEDLG, * LPNM_RUNFILEDLG;
-
-/* RunFileDlg notification return values */
-#define RF_OK      0x00
-#define RF_CANCEL  0x01
-#define RF_RETRY   0x02
-
-void WINAPI RunFileDlg(
-       HWND hwndOwner,
-       HICON hIcon,
-       LPCWSTR lpstrDirectory,
-       LPCWSTR lpstrTitle,
-       LPCWSTR lpstrDescription,
-       UINT uFlags);
-
-void WINAPI ExitWindowsDialog(HWND hwndOwner);
-
-BOOL WINAPI SHFindComputer(
-       LPCITEMIDLIST pidlRoot,
-       LPCITEMIDLIST pidlSavedSearch);
-
-void WINAPI SHHandleDiskFull(HWND hwndOwner,
-       UINT uDrive);
-
-int  WINAPI SHOutOfMemoryMessageBox(
-       HWND hwndOwner,
-       LPCSTR lpCaption,
-       UINT uType);
-
-DWORD WINAPI SHNetConnectionDialog(
-       HWND hwndOwner,
-       LPCWSTR lpstrRemoteName,
-       DWORD dwType);
-
-/****************************************************************************
- * Cabinet Window Messages
- */
-
-#define CWM_SETPATH           (WM_USER + 2)
-#define CWM_WANTIDLE         (WM_USER + 3)
-#define CWM_GETSETCURRENTINFO (WM_USER + 4)
-#define CWM_SELECTITEM        (WM_USER + 5)
-#define CWM_SELECTITEMSTR     (WM_USER + 6)
-#define CWM_GETISHELLBROWSER  (WM_USER + 7)
-#define CWM_TESTPATH          (WM_USER + 9)
-#define CWM_STATECHANGE       (WM_USER + 10)
-#define CWM_GETPATH           (WM_USER + 12)
-
-/* CWM_TESTPATH types */
-#define CWTP_ISEQUAL  0
-#define CWTP_ISCHILD  1
-
-/* CWM_TESTPATH structure */
-typedef struct
-{
-       DWORD dwType;
-       ITEMIDLIST idl;
-} CWTESTPATHSTRUCT,* LPCWTESTPATHSTRUCT;
-
-/****************************************************************************
- * System Imagelist Routines
- */
-
-int WINAPI Shell_GetCachedImageIndexA(
-       LPCSTR lpszFileName,
-       int nIconIndex,
-       UINT bSimulateDoc);
-
-BOOL WINAPI Shell_GetImageLists(
-       HIMAGELIST *lphimlLarge,
-       HIMAGELIST *lphimlSmall);
-
-HICON WINAPI SHGetFileIcon(
-       DWORD dwReserved,
-       LPCSTR lpszPath,
-       DWORD dwFileAttributes,
-       UINT uFlags);
-
-BOOL WINAPI FileIconInit(BOOL bFullInit);
-
-/****************************************************************************
- * File Menu Routines
- */
-/* FileMenu_Create nSelHeight constants */
-#define FM_DEFAULT_SELHEIGHT  -1
-#define FM_FULL_SELHEIGHT     0
-
-/* FileMenu_Create flags */
-#define FMF_SMALL_ICONS      0x00
-#define FMF_LARGE_ICONS      0x08
-#define FMF_NO_COLUMN_BREAK  0x10
-
-HMENU WINAPI FileMenu_Create(
-       COLORREF crBorderColor,
-       int nBorderWidth,
-       HBITMAP hBorderBmp,
-       int nSelHeight,
-       UINT uFlags);
-
-void WINAPI FileMenu_Destroy(HMENU hMenu);
-
-/* FileMenu_AppendItem constants */
-#define FM_SEPARATOR       (LPCSTR)1
-#define FM_BLANK_ICON      -1
-#define FM_DEFAULT_HEIGHT  0
-
-BOOL WINAPI FileMenu_AppendItem(
-       HMENU hMenu,
-       LPCSTR lpszText,
-       UINT uID,
-       int iIcon,
-       HMENU hMenuPopup,
-       int nItemHeight);
-
-/* FileMenu_InsertUsingPidl flags */
-#define FMF_NO_EMPTY_ITEM      0x01
-#define FMF_NO_PROGRAM_GROUPS  0x04
-
-/* FileMenu_InsertUsingPidl callback function */
-typedef void (CALLBACK *LPFNFMCALLBACK)(LPCITEMIDLIST pidlFolder, 
LPCITEMIDLIST pidlFile);
-
-int WINAPI FileMenu_InsertUsingPidl(
-       HMENU hMenu,
-       UINT uID,
-       LPCITEMIDLIST pidl,
-       UINT uFlags,
-       UINT uEnumFlags,
-       LPFNFMCALLBACK lpfnCallback);
-
-int WINAPI FileMenu_ReplaceUsingPidl(
-       HMENU hMenu,
-       UINT uID,
-       LPCITEMIDLIST pidl,
-       UINT uEnumFlags,
-       LPFNFMCALLBACK lpfnCallback);
-
-void WINAPI FileMenu_Invalidate(HMENU hMenu);
-
-HMENU WINAPI FileMenu_FindSubMenuByPidl(
-       HMENU hMenu,
-       LPCITEMIDLIST pidl);
-
-BOOL WINAPI FileMenu_TrackPopupMenuEx(
-       HMENU hMenu,
-       UINT uFlags,
-       int x,
-       int y,
-       HWND hWnd,
-       LPTPMPARAMS lptpm);
-
-BOOL WINAPI FileMenu_GetLastSelectedItemPidls(
-       UINT uReserved,
-       LPCITEMIDLIST *ppidlFolder,
-       LPCITEMIDLIST *ppidlItem);
-
-LRESULT WINAPI FileMenu_MeasureItem(
-       HWND hWnd,
-       LPMEASUREITEMSTRUCT lpmis);
-
-LRESULT WINAPI FileMenu_DrawItem(
-       HWND hWnd,
-       LPDRAWITEMSTRUCT lpdis);
-
-BOOL WINAPI FileMenu_InitMenuPopup(HMENU hMenu);
-
-void WINAPI FileMenu_AbortInitMenu(void);
-
-LRESULT WINAPI FileMenu_HandleMenuChar(
-       HMENU hMenu,
-       WPARAM wParam);
-
-BOOL WINAPI FileMenu_DeleteAllItems(HMENU hMenu);
-
-BOOL WINAPI FileMenu_DeleteItemByCmd(
-       HMENU hMenu,
-       UINT uID);
-
-BOOL WINAPI FileMenu_DeleteItemByIndex(
-       HMENU hMenu,
-       UINT uPos);
-
-BOOL WINAPI FileMenu_DeleteMenuItemByFirstID(
-       HMENU hMenu,
-       UINT uID);
-
-BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu);
-
-BOOL WINAPI FileMenu_EnableItemByCmd(
-       HMENU hMenu,
-       UINT uID,
-       BOOL bEnable);
-
-DWORD WINAPI FileMenu_GetItemExtent(
-       HMENU hMenu,
-       UINT uPos);
-
-int WINAPI FileMenu_AppendFilesForPidl(
-       HMENU hMenu,
-       LPCITEMIDLIST pidl,
-       BOOL bAddSeparator);
-
-int WINAPI FileMenu_AddFilesForPidl(
-       HMENU hMenu,
-       UINT uReserved,
-       UINT uID,
-       LPCITEMIDLIST pidl,
-       UINT uFlags,
-       UINT uEnumFlags,
-       LPFNFMCALLBACK lpfnCallback);
-
-/****************************************************************************
- * Drag And Drop Routines
- */
-
-HRESULT WINAPI SHRegisterDragDrop(
-       HWND hWnd,
-       LPDROPTARGET lpDropTarget);
-
-HRESULT WINAPI SHRevokeDragDrop(HWND hWnd);
-
-BOOL WINAPI DAD_DragEnter(HWND hWnd);
-
-BOOL WINAPI DAD_SetDragImageFromListView(
-       HWND hWnd,
-       POINT pt);
-
-BOOL WINAPI DAD_ShowDragImage(BOOL bShow);
-
-/****************************************************************************
- * Path Manipulation Routines
- */
-
-BOOL WINAPI PathAppendAW(LPVOID lpszPath1, LPCVOID lpszPath2);
-
-LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile);
-
-LPVOID  WINAPI PathAddBackslashAW(LPVOID path);
-
-LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive);
-
-LPVOID WINAPI PathFindExtensionAW(LPCVOID path);
-
-LPVOID WINAPI PathFindFileNameAW(LPCVOID path);
-
-LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath,  DWORD void1, DWORD void2);
-
-LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath);
-
-BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath);
-
-void WINAPI PathRemoveBlanksAW(LPVOID lpszPath);
-
-VOID  WINAPI PathQuoteSpacesAW(LPVOID path);
-
-void WINAPI PathUnquoteSpacesAW(LPVOID lpszPath);
-
-BOOL WINAPI PathIsUNCAW(LPCVOID lpszPath);
-
-BOOL WINAPI PathIsRelativeAW(LPCVOID lpszPath);
-
-BOOL WINAPI PathIsRootAW(LPCVOID x);
-
-BOOL WINAPI PathIsExeAW(LPCVOID lpszPath);
-
-BOOL WINAPI PathIsDirectoryAW(LPCVOID lpszPath);
-
-BOOL WINAPI PathFileExistsAW(LPCVOID lpszPath);
-
-BOOL WINAPI PathMatchSpecAW(LPVOID lpszPath, LPVOID lpszSpec);
-
-BOOL WINAPI PathMakeUniqueNameAW(
-       LPVOID lpszBuffer,
-       DWORD dwBuffSize,
-       LPCVOID lpszShortName,
-       LPCVOID lpszLongName,
-       LPCVOID lpszPathName);
-
-BOOL WINAPI PathYetAnotherMakeUniqueName(
-       LPWSTR lpszBuffer,
-       LPCWSTR lpszPathName,
-       LPCWSTR lpszShortName,
-       LPCWSTR lpszLongName);
-
-BOOL  WINAPI PathQualifyAW(LPCVOID path);
-
-
-/* PathResolve flags */
-#define PRF_CHECKEXISTANCE  0x01
-#define PRF_EXECUTABLE      0x02
-#define PRF_QUALIFYONPATH   0x04
-#define PRF_WINDOWS31       0x08
-
-BOOL WINAPI PathResolveAW(LPVOID lpszPath, LPCVOID *alpszPaths, DWORD dwFlags);
-
-VOID WINAPI PathSetDlgItemPathAW(HWND hDlg, int nIDDlgItem, LPCVOID lpszPath);
-
-/* PathProcessCommand flags */
-#define PPCF_QUOTEPATH        0x01 /* implies PPCF_INCLUDEARGS */
-#define PPCF_INCLUDEARGS      0x02
-//#define PPCF_NODIRECTORIES    0x10 move to shlobj
-#define PPCF_DONTRESOLVE      0x20
-#define PPCF_PATHISRELATIVE   0x40
-
-HRESULT WINAPI PathProcessCommandAW(LPCVOID lpszPath, LPVOID lpszBuff,
-                               DWORD dwBuffSize, DWORD dwFlags);
-
-void WINAPI PathStripPathAW(LPVOID lpszPath);
-
-BOOL WINAPI PathStripToRootAW(LPVOID lpszPath);
-
-void WINAPI PathRemoveArgsAW(LPVOID lpszPath);
-
-void WINAPI PathRemoveExtensionAW(LPVOID lpszPath);
-
-int WINAPI PathParseIconLocationAW(LPVOID lpszPath);
-
-BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2);
-
-BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID *sOtherDirs);
-
-/****************************************************************************
- * Shell Namespace Routines
- */
-
-/* Generic structure used by several messages */
-typedef struct
-{
-  DWORD          dwReserved;
-  DWORD          dwReserved2;
-  LPCITEMIDLIST  pidl;
-  LPDWORD        lpdwUser;
-} SFVCBINFO, * LPSFVCBINFO;
-typedef const SFVCBINFO * LPCSFVCBINFO;
-
-/* SFVCB_SELECTIONCHANGED structure */
-typedef struct
-{
-  UINT           uOldState;
-  UINT           uNewState;
-  LPCITEMIDLIST  pidl;
-  LPDWORD        lpdwUser;
-} SFVSELECTSTATE, * LPSFVSELECTSTATE;
-typedef const SFVSELECTSTATE * LPCSFVSELECTSTATE;
-
-/* SFVCB_COPYHOOKCALLBACK structure */
-typedef struct
-{
-  HWND    hwnd;
-  UINT    wFunc;
-  UINT    wFlags;
-  LPCSTR  pszSrcFile;
-  DWORD   dwSrcAttribs;
-  LPCSTR  pszDestFile;
-  DWORD   dwDestAttribs;
-} SFVCOPYHOOKINFO, * LPSFVCOPYHOOKINFO;
-typedef const SFVCOPYHOOKINFO * LPCSFVCOPYHOOKINFO;
-
-/* SFVCB_GETDETAILSOF structure */
-typedef struct
-{
-  LPCITEMIDLIST  pidl;
-  int            fmt;
-  int            cx;
-  STRRET         lpText;
-} SFVCOLUMNINFO, * LPSFVCOLUMNINFO;
-
-/****************************************************************************
- * Misc Stuff
- */
-
-/* SHWaitForFileToOpen flags */
-#define SHWFF_ADD     0x01
-#define SHWFF_REMOVE  0x02
-#define SHWFF_WAIT    0x04
-
-BOOL WINAPI SHWaitForFileToOpen(
-       LPCITEMIDLIST pidl,
-       DWORD dwFlags,
-       DWORD dwTimeout);
-
-WORD WINAPI ArrangeWindows(
-       HWND hwndParent,
-       DWORD dwReserved,
-       LPCRECT lpRect,
-       WORD cKids,
-       CONST HWND * lpKids);
-
-/* RegisterShellHook types */
-#define RSH_DEREGISTER        0
-#define RSH_REGISTER          1
-#define RSH_REGISTER_PROGMAN  2
-#define RSH_REGISTER_TASKMAN  3
-
-BOOL WINAPI RegisterShellHook(
-       HWND hWnd,
-       DWORD dwType);
-
-/* SHCreateDefClassObject callback function */
-typedef HRESULT (CALLBACK *LPFNCDCOCALLBACK)(
-       LPUNKNOWN pUnkOuter,
-       REFIID riidObject,
-       LPVOID *ppvObject);
-
-HRESULT WINAPI SHCreateDefClassObject(
-       REFIID riidFactory,
-       LPVOID *ppvFactory,
-       LPFNCDCOCALLBACK lpfnCallback,
-       LPDWORD lpdwUsage,
-       REFIID riidObject);
-
-void WINAPI SHFreeUnusedLibraries(void);
-
-/* SHCreateLinks flags */
-#define SHCLF_PREFIXNAME       0x01
-#define SHCLF_CREATEONDESKTOP  0x02
-
-HRESULT WINAPI SHCreateLinks(
-       HWND hWnd,
-       LPCSTR lpszDir,
-       LPDATAOBJECT lpDataObject,
-       UINT uFlags,
-       LPITEMIDLIST *lppidlLinks);
-
-DWORD WINAPI CheckEscapesA(LPSTR string, DWORD len);
-DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len);
-
-/* policy functions */
-BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey);
-
-/* Shell Desktop functions */
-
-#define WM_GETISHELLBROWSER (WM_USER+7)
-
-BOOL WINAPI SHDesktopMessageLoop(HANDLE);
-
-#define CSIDL_FOLDER_MASK      0x00ff
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif /* defined(__cplusplus) */
-
-#endif /* __WINE_UNDOCSHELL_H */

Copied: branches/shell-experiments/include/reactos/undocshell.h (from r64853, 
branches/shell-experiments/dll/win32/shell32/undocshell.h)
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/include/reactos/undocshell.h?p2=branches/shell-experiments/include/reactos/undocshell.h&p1=branches/shell-experiments/dll/win32/shell32/undocshell.h&r1=64853&r2=64854&rev=64854&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/shell32/undocshell.h   [iso-8859-1] 
(original)
+++ branches/shell-experiments/include/reactos/undocshell.h     [iso-8859-1] 
Mon Oct 20 21:09:55 2014
@@ -529,8 +529,315 @@
 
 #define CSIDL_FOLDER_MASK      0x00ff
 
+/* Utility functions */
+#include <stdio.h>
+
+static inline ULONG
+Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
+{
+    char szMsg[512];
+    char *szMsgStart;
+    const char *fname;
+    va_list vl;
+    ULONG uRet;
+
+    fname = strrchr(filename, '\\');
+    if (fname == NULL)
+    {
+        fname = strrchr(filename, '/');
+        if (fname != NULL)
+            fname++;
+    }
+    else
+        fname++;
+
+    if (fname == NULL)
+        fname = filename;
+
+    szMsgStart = szMsg + sprintf(szMsg, "%s:%d: ", fname, line);
+
+    va_start(vl, lpFormat);
+    uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl);
+    va_end(vl);
+
+    OutputDebugStringA(szMsg);
+
+    return uRet;
+}
+
+#define DbgPrint(fmt, ...) \
+    Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
+
+static inline void DbgDumpMenuInternal(HMENU hmenu, char* padding, int 
padlevel)
+{
+    WCHAR label[128];
+
+    padding[padlevel] = '.';
+    padding[padlevel + 1] = '.';
+    padding[padlevel + 2] = 0;
+
+    int count = GetMenuItemCount(hmenu);
+    for (int i = 0; i < count; i++)
+    {
+        MENUITEMINFOW mii = { 0 };
+
+        mii.cbSize = sizeof(mii);
+        mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | 
MIIM_ID;
+        mii.dwTypeData = label;
+        mii.cch = _countof(label);
+
+        GetMenuItemInfo(hmenu, i, TRUE, &mii);
+
+        if (mii.fType & MFT_BITMAP)
+            DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", 
padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
+        else if (mii.fType & MFT_SEPARATOR)
+            DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID);
+        else
+            DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, 
i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE");
+
+        if (mii.hSubMenu)
+            DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2);
+
+    }
+
+    padding[padlevel] = 0;
+}
+
+static __inline void DbgDumpMenu(HMENU hmenu)
+{
+    char padding[128];
+    DbgDumpMenuInternal(hmenu, padding, 0);
+}
+
+#if 1
+#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure 
%08x.\n", hr), TRUE))
+#else
+#define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
+#endif
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* defined(__cplusplus) */
 
+#ifdef __cplusplus
+template <class Base>
+class CComDebugObject : public Base
+{
+public:
+    CComDebugObject(void * = NULL)
+    {
+        _pAtlModule->Lock();
+    }
+
+    virtual ~CComDebugObject()
+    {
+        this->FinalRelease();
+        _pAtlModule->Unlock();
+    }
+
+    STDMETHOD_(ULONG, AddRef)()
+    {
+        int rc = this->InternalAddRef();
+        DbgPrint("RefCount is now %d(++)!\n", rc);
+        return rc;
+    }
+
+    STDMETHOD_(ULONG, Release)()
+    {
+        ULONG                                                          
newRefCount;
+
+        newRefCount = this->InternalRelease();
+        DbgPrint("RefCount is now %d(--)!\n", newRefCount);
+        if (newRefCount == 0)
+            delete this;
+        return newRefCount;
+    }
+
+    STDMETHOD(QueryInterface)(REFIID iid, void **ppvObject)
+    {
+        return this->_InternalQueryInterface(iid, ppvObject);
+    }
+
+    static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
+    {
+        CComDebugObject<Base>                          *newInstance;
+        HRESULT                                                                
hResult;
+
+        ATLASSERT(pp != NULL);
+        if (pp == NULL)
+            return E_POINTER;
+
+        hResult = E_OUTOFMEMORY;
+        newInstance = NULL;
+        ATLTRY(newInstance = new CComDebugObject<Base>())
+            if (newInstance != NULL)
+            {
+            newInstance->SetVoid(NULL);
+            newInstance->InternalFinalConstructAddRef();
+            hResult = newInstance->_AtlInitialConstruct();
+            if (SUCCEEDED(hResult))
+                hResult = newInstance->FinalConstruct();
+            if (SUCCEEDED(hResult))
+                hResult = newInstance->_AtlFinalConstruct();
+            newInstance->InternalFinalConstructRelease();
+            if (hResult != S_OK)
+            {
+                delete newInstance;
+                newInstance = NULL;
+            }
+            }
+        *pp = newInstance;
+        return hResult;
+    }
+};
+
+template<class T, class R>
+HRESULT inline ShellObjectCreator(REFIID riid, R ** 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, reinterpret_cast<void **>(ppv));
+    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;
+
+    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();
+    if (FAILED(hResult))
+        return hResult;
+
+    *ppv = result.Detach();
+
+    return S_OK;
+}
+
+template<class T, class T1, class R>
+HRESULT inline ShellObjectCreatorInit(T1 initArg1, 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;
+
+    hResult = obj->Initialize(initArg1);
+    if (FAILED(hResult))
+        return hResult;
+
+    *ppv = result.Detach();
+
+    return S_OK;
+}
+
+template<class T, class T1, class T2, class R>
+HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, 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;
+
+    hResult = obj->Initialize(initArg1, initArg2);
+    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;
+
+    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, initArg2, initArg3);
+    if (FAILED(hResult))
+        return hResult;
+
+    *ppv = result.Detach();
+
+    return S_OK;
+}
+
+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)
+{
+    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;
+
+    hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4);
+    if (FAILED(hResult))
+        return hResult;
+
+    *ppv = result.Detach();
+
+    return S_OK;
+}
+#endif /* __cplusplus */
+
 #endif /* __WINE_UNDOCSHELL_H */


Reply via email to