From 2769768c33b977ff1be6cfbdc2e4fa20f26e0b3d Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Fri, 14 Apr 2017 20:03:46 +0000 Subject: [PATCH] [SHELLUTILS.H] - 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 --- reactos/base/shell/rshell/misc.cpp | 2 - reactos/base/shell/rshell/rshell.spec | 2 +- .../win32/browseui/shellbars/CBandSite.cpp | 4 +- .../shellbars/CSHEnumClassesOfCategories.cpp | 4 +- reactos/dll/win32/shell32/CDefView.cpp | 2 +- reactos/dll/win32/shell32/CEnumIDListBase.cpp | 2 +- reactos/dll/win32/shell32/CIDLDataObj.cpp | 4 +- .../shell32/folders/CControlPanelFolder.cpp | 2 +- .../shell32/folders/CControlPanelFolder.h | 1 - .../win32/shell32/folders/CDesktopFolder.cpp | 2 +- .../win32/shell32/folders/CDrivesFolder.cpp | 2 +- .../dll/win32/shell32/folders/CFSFolder.cpp | 2 +- .../dll/win32/shell32/folders/CNetFolder.cpp | 2 +- .../win32/shell32/folders/CPrinterFolder.cpp | 2 +- .../dll/win32/shell32/folders/CRecycleBin.cpp | 2 +- reactos/dll/win32/shell32/shell32.cpp | 2 +- reactos/sdk/include/reactos/shellutils.h | 276 +++++------------- 17 files changed, 85 insertions(+), 228 deletions(-) diff --git a/reactos/base/shell/rshell/misc.cpp b/reactos/base/shell/rshell/misc.cpp index 84087d3fbfa..de6fc00d1e7 100644 --- a/reactos/base/shell/rshell/misc.cpp +++ b/reactos/base/shell/rshell/misc.cpp @@ -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) diff --git a/reactos/base/shell/rshell/rshell.spec b/reactos/base/shell/rshell/rshell.spec index 0d33b0084dd..04e5eaad3e6 100644 --- a/reactos/base/shell/rshell/rshell.spec +++ b/reactos/base/shell/rshell/rshell.spec @@ -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); diff --git a/reactos/dll/win32/browseui/shellbars/CBandSite.cpp b/reactos/dll/win32/browseui/shellbars/CBandSite.cpp index f23e79d53f4..efd3c9954b7 100644 --- a/reactos/dll/win32/browseui/shellbars/CBandSite.cpp +++ b/reactos/dll/win32/browseui/shellbars/CBandSite.cpp @@ -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(riid, ppv); + return CBandSite::_CreatorClass::CreateInstance(pUnkOuter, riid, ppv); } diff --git a/reactos/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp b/reactos/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp index d47236b8ec0..c2915a725fc 100644 --- a/reactos/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp +++ b/reactos/dll/win32/browseui/shellbars/CSHEnumClassesOfCategories.cpp @@ -327,8 +327,8 @@ extern "C" HRESULT WINAPI SHEnumClassesOfCategories(ULONG cImplemented, CATID *p { HRESULT hr; - hr = ShellObjectCreatorInit( - cImplemented, pImplemented, cRequired, pRequired, IID_IEnumGUID, out); + hr = ShellObjectCreatorInit( + cImplemented, pImplemented, cRequired, pRequired, IID_PPV_ARG(IEnumGUID, out)); if (FAILED_UNEXPECTEDLY(hr)) return hr; return S_OK; diff --git a/reactos/dll/win32/shell32/CDefView.cpp b/reactos/dll/win32/shell32/CDefView.cpp index aa2f510ef98..bc69b61ab63 100644 --- a/reactos/dll/win32/shell32/CDefView.cpp +++ b/reactos/dll/win32/shell32/CDefView.cpp @@ -3156,7 +3156,7 @@ HRESULT CDefView::_MergeToolbar() */ HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView) { - return ShellObjectCreatorInit(pFolder, IID_IShellView, newView); + return ShellObjectCreatorInit(pFolder, IID_PPV_ARG(IShellView, newView)); } HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut) diff --git a/reactos/dll/win32/shell32/CEnumIDListBase.cpp b/reactos/dll/win32/shell32/CEnumIDListBase.cpp index 8e7a6186257..50facd5643d 100644 --- a/reactos/dll/win32/shell32/CEnumIDListBase.cpp +++ b/reactos/dll/win32/shell32/CEnumIDListBase.cpp @@ -281,5 +281,5 @@ HRESULT WINAPI CEnumIDListBase::Clone(LPENUMIDLIST *ppenum) */ HRESULT IEnumIDList_Constructor(IEnumIDList **enumerator) { - return ShellObjectCreator(IID_IEnumIDList, enumerator); + return ShellObjectCreator(IID_PPV_ARG(IEnumIDList, enumerator)); } diff --git a/reactos/dll/win32/shell32/CIDLDataObj.cpp b/reactos/dll/win32/shell32/CIDLDataObj.cpp index b11e65af4c7..e381e1b153b 100644 --- a/reactos/dll/win32/shell32/CIDLDataObj.cpp +++ b/reactos/dll/win32/shell32/CIDLDataObj.cpp @@ -129,7 +129,7 @@ HRESULT WINAPI IEnumFORMATETCImpl::Clone(LPENUMFORMATETC* ppenum) HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat) { - return ShellObjectCreatorInit(cfmt, afmt, IID_IEnumFORMATETC, ppFormat); + return ShellObjectCreatorInit(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(hwndOwner, pMyPidl, apidl, cidl, IID_IDataObject, dataObject); + return ShellObjectCreatorInit(hwndOwner, pMyPidl, apidl, cidl, IID_PPV_ARG(IDataObject, dataObject)); } /************************************************************************* diff --git a/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp b/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp index 6a0a79dfc01..b95e32adfd7 100644 --- a/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp @@ -311,7 +311,7 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName( */ HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CControlPanelFolder.h b/reactos/dll/win32/shell32/folders/CControlPanelFolder.h index dbef5473b3a..a4966a3569f 100644 --- a/reactos/dll/win32/shell32/folders/CControlPanelFolder.h +++ b/reactos/dll/win32/shell32/folders/CControlPanelFolder.h @@ -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); diff --git a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp index 8d7b4ebc496..6ce397cf831 100644 --- a/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp @@ -441,7 +441,7 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName( */ HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - return ShellObjectCreatorInit(this, hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp b/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp index 00c8107854f..5f0fa0abaf5 100644 --- a/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp @@ -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(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CFSFolder.cpp b/reactos/dll/win32/shell32/folders/CFSFolder.cpp index feb6f5a0426..10d417732c2 100644 --- a/reactos/dll/win32/shell32/folders/CFSFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CFSFolder.cpp @@ -253,7 +253,7 @@ HRESULT WINAPI CFSFolder::EnumObjects( DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - return ShellObjectCreatorInit(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CNetFolder.cpp b/reactos/dll/win32/shell32/folders/CNetFolder.cpp index 9f7d0167589..17da04a5076 100644 --- a/reactos/dll/win32/shell32/folders/CNetFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CNetFolder.cpp @@ -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(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp index c7df54fc79c..5b19044df53 100644 --- a/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CPrinterFolder.cpp @@ -226,7 +226,7 @@ static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl) */ HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) { - return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } /************************************************************************** diff --git a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp index ba80e3b9ff9..ba4d3c0ec50 100644 --- a/reactos/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/reactos/dll/win32/shell32/folders/CRecycleBin.cpp @@ -488,7 +488,7 @@ UnpackDetailsFromPidl(LPCITEMIDLIST pidl) HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); + return ShellObjectCreatorInit(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList)); } HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv) diff --git a/reactos/dll/win32/shell32/shell32.cpp b/reactos/dll/win32/shell32/shell32.cpp index 035a23996d9..ea8af8a9287 100644 --- a/reactos/dll/win32/shell32/shell32.cpp +++ b/reactos/dll/win32/shell32/shell32.cpp @@ -158,7 +158,7 @@ HRESULT WINAPI IDefClFImpl::LockServer(BOOL fLock) HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory) { - return ShellObjectCreatorInit(lpfnCI, pcRefDll, riidInst, IID_IClassFactory, theFactory); + return ShellObjectCreatorInit(lpfnCI, pcRefDll, riidInst, IID_PPV_ARG(IClassFactory, theFactory)); } /****************************************************************************** diff --git a/reactos/sdk/include/reactos/shellutils.h b/reactos/sdk/include/reactos/shellutils.h index d89094f18b7..1e8aa314ad4 100644 --- a/reactos/sdk/include/reactos/shellutils.h +++ b/reactos/sdk/include/reactos/shellutils.h @@ -213,273 +213,133 @@ HRESULT inline ShellDebugObjectCreator(REFIID riid, R ** ppv) return S_OK; } -template -HRESULT inline ShellObjectCreator(REFIID riid, R ** ppv) +template +HRESULT inline ShellObjectCreator(REFIID riid, void ** ppv) { - CComPtr obj; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; -ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED(hResult)) - return hResult; - return S_OK; -} - -template -HRESULT inline ShellObjectCreatorInit(REFIID riid, R ** ppv) -{ - CComPtr obj; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + hResult = _CComObject::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->QueryInterface(riid, reinterpret_cast(ppv)); - return S_OK; + pobj->Release(); /* In case of failure the object will be released */ + + return hResult; } template HRESULT inline ShellObjectCreatorInit(REFIID riid, void ** ppv) { - CComPtr obj; - CComPtr result; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + hResult = _CComObject::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(ppv)); + + pobj->Release(); /* In case of failure the object will be released */ + + return hResult; } template HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, void ** ppv) { - CComPtr obj; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, ppv); + hResult = _CComObject::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); + + if (SUCCEEDED(hResult)) + hResult = pobj->QueryInterface(riid, reinterpret_cast(ppv)); + + pobj->Release(); /* In case of failure the object will be released */ + + return hResult; } template HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, void ** ppv) { - CComPtr obj; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, ppv); + hResult = _CComObject::CreateInstance(&pobj); if (FAILED(hResult)) return hResult; - hResult = obj->Initialize(initArg1, initArg2); - if (FAILED(hResult)) - return hResult; + pobj->AddRef(); /* CreateInstance returns object with 0 ref count */ - return S_OK; + hResult = pobj->Initialize(initArg1, initArg2); + + if (SUCCEEDED(hResult)) + hResult = pobj->QueryInterface(riid, reinterpret_cast(ppv)); + + pobj->Release(); /* In case of failure the object will be released */ + + return hResult; } template HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, void ** ppv) { - CComPtr obj; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, ppv); + hResult = _CComObject::CreateInstance(&pobj); if (FAILED(hResult)) return hResult; - hResult = obj->Initialize(initArg1, initArg2, initArg3); - if (FAILED(hResult)) - return hResult; + pobj->AddRef(); /* CreateInstance returns object with 0 ref count */ - return S_OK; + hResult = pobj->Initialize(initArg1, initArg2, initArg3); + + if (SUCCEEDED(hResult)) + hResult = pobj->QueryInterface(riid, reinterpret_cast(ppv)); + + pobj->Release(); /* In case of failure the object will be released */ + + return hResult; } -template -HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, R ** ppv) +template +HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, void ** ppv) { - CComPtr obj; - CComPtr result; - HRESULT hResult; + _CComObject *pobj; + HRESULT hResult; - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + hResult = _CComObject::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 */ - *ppv = result.Detach(); + hResult = pobj->Initialize(initArg1, initArg2, initArg3, initArg4); - return S_OK; -} + if (SUCCEEDED(hResult)) + hResult = pobj->QueryInterface(riid, reinterpret_cast(ppv)); -template -HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, R ** ppv) -{ - CComPtr obj; - CComPtr result; - HRESULT hResult; + pobj->Release(); /* In case of failure the object will be released */ - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); - if (FAILED(hResult)) - return hResult; - - hResult = obj->Initialize(initArg1, initArg2); - if (FAILED(hResult)) - return hResult; - - *ppv = result.Detach(); - - return S_OK; -} - -template -HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, R ** ppv) -{ - CComPtr obj; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); - if (FAILED(hResult)) - return hResult; - - hResult = obj->Initialize(initArg1, initArg2, initArg3); - if (FAILED(hResult)) - return hResult; - - *ppv = result.Detach(); - - return S_OK; -} - -template -HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, R ** ppv) -{ - CComPtr obj; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); - if (FAILED(hResult)) - return hResult; - - hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4); - if (FAILED(hResult)) - return hResult; - - *ppv = result.Detach(); - - return S_OK; -} - -template -HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5, REFIID riid, R ** ppv) -{ - CComPtr obj; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(obj = new _CComObject); - if (obj.p == NULL) - return E_OUTOFMEMORY; - hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); - if (FAILED(hResult)) - return hResult; - - hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4, initArg5); - if (FAILED(hResult)) - return hResult; - - *ppv = result.Detach(); - - return S_OK; + return hResult; } HRESULT inline SHSetStrRet(LPSTRRET pStrRet, LPCSTR pstrValue)