mirror of
https://github.com/reactos/reactos.git
synced 2025-05-07 02:41:22 +00:00
[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
This commit is contained in:
parent
569891558f
commit
2769768c33
17 changed files with 85 additions and 228 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -831,7 +831,7 @@ HRESULT STDMETHODCALLTYPE CBandSiteBase::SaveToStreamBS(IUnknown *, IStream *)
|
|||
}
|
||||
|
||||
extern "C"
|
||||
HRESULT WINAPI CBandSite_CreateInstance(REFIID riid, void **ppv)
|
||||
HRESULT WINAPI CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv)
|
||||
{
|
||||
return ShellObjectCreator<CBandSite>(riid, ppv);
|
||||
return CBandSite::_CreatorClass::CreateInstance(pUnkOuter, riid, ppv);
|
||||
}
|
||||
|
|
|
@ -327,8 +327,8 @@ extern "C" HRESULT WINAPI SHEnumClassesOfCategories(ULONG cImplemented, CATID *p
|
|||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = ShellObjectCreatorInit<CSHEnumClassesOfCategories, ULONG, CATID*, ULONG, CATID*, IEnumGUID>(
|
||||
cImplemented, pImplemented, cRequired, pRequired, IID_IEnumGUID, out);
|
||||
hr = ShellObjectCreatorInit<CSHEnumClassesOfCategories>(
|
||||
cImplemented, pImplemented, cRequired, pRequired, IID_PPV_ARG(IEnumGUID, out));
|
||||
if (FAILED_UNEXPECTEDLY(hr))
|
||||
return hr;
|
||||
return S_OK;
|
||||
|
|
|
@ -3156,7 +3156,7 @@ HRESULT CDefView::_MergeToolbar()
|
|||
*/
|
||||
HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView)
|
||||
{
|
||||
return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
|
||||
return ShellObjectCreatorInit<CDefView>(pFolder, IID_PPV_ARG(IShellView, newView));
|
||||
}
|
||||
|
||||
HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
|
||||
|
|
|
@ -281,5 +281,5 @@ HRESULT WINAPI CEnumIDListBase::Clone(LPENUMIDLIST *ppenum)
|
|||
*/
|
||||
HRESULT IEnumIDList_Constructor(IEnumIDList **enumerator)
|
||||
{
|
||||
return ShellObjectCreator<CEnumIDListBase>(IID_IEnumIDList, enumerator);
|
||||
return ShellObjectCreator<CEnumIDListBase>(IID_PPV_ARG(IEnumIDList, enumerator));
|
||||
}
|
||||
|
|
|
@ -129,7 +129,7 @@ HRESULT WINAPI IEnumFORMATETCImpl::Clone(LPENUMFORMATETC* ppenum)
|
|||
|
||||
HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat)
|
||||
{
|
||||
return ShellObjectCreatorInit<IEnumFORMATETCImpl>(cfmt, afmt, IID_IEnumFORMATETC, ppFormat);
|
||||
return ShellObjectCreatorInit<IEnumFORMATETCImpl>(cfmt, afmt, IID_PPV_ARG(IEnumFORMATETC, ppFormat));
|
||||
}
|
||||
|
||||
|
||||
|
@ -410,7 +410,7 @@ HRESULT WINAPI CIDLDataObj::EndOperation(HRESULT hResult, IBindCtx *pbcReserved,
|
|||
*/
|
||||
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, IDataObject **dataObject)
|
||||
{
|
||||
return ShellObjectCreatorInit<CIDLDataObj>(hwndOwner, pMyPidl, apidl, cidl, IID_IDataObject, dataObject);
|
||||
return ShellObjectCreatorInit<CIDLDataObj>(hwndOwner, pMyPidl, apidl, cidl, IID_PPV_ARG(IDataObject, dataObject));
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
|
|
@ -311,7 +311,7 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName(
|
|||
*/
|
||||
HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CControlPanelEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -441,7 +441,7 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName(
|
|||
*/
|
||||
HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -377,7 +377,7 @@ HRESULT WINAPI CDrivesFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLEST
|
|||
*/
|
||||
HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -253,7 +253,7 @@ HRESULT WINAPI CFSFolder::EnumObjects(
|
|||
DWORD dwFlags,
|
||||
LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -274,7 +274,7 @@ HRESULT WINAPI CNetFolder::ParseDisplayName(HWND hwndOwner, LPBC pbcReserved, LP
|
|||
*/
|
||||
HRESULT WINAPI CNetFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CNetFolderEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CNetFolderEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -226,7 +226,7 @@ static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl)
|
|||
*/
|
||||
HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CPrintersEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
|
@ -488,7 +488,7 @@ UnpackDetailsFromPidl(LPCITEMIDLIST pidl)
|
|||
|
||||
HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
|
||||
{
|
||||
return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_IEnumIDList, ppEnumIDList);
|
||||
return ShellObjectCreatorInit<CRecycleBinEnum>(dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
|
||||
}
|
||||
|
||||
HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv)
|
||||
|
|
|
@ -158,7 +158,7 @@ HRESULT WINAPI IDefClFImpl::LockServer(BOOL fLock)
|
|||
|
||||
HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory)
|
||||
{
|
||||
return ShellObjectCreatorInit<IDefClFImpl>(lpfnCI, pcRefDll, riidInst, IID_IClassFactory, theFactory);
|
||||
return ShellObjectCreatorInit<IDefClFImpl>(lpfnCI, pcRefDll, riidInst, IID_PPV_ARG(IClassFactory, theFactory));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -213,273 +213,133 @@ HRESULT inline ShellDebugObjectCreator(REFIID riid, R ** ppv)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
template<class T, class R>
|
||||
HRESULT inline ShellObjectCreator(REFIID riid, R ** ppv)
|
||||
template<class T>
|
||||
HRESULT inline ShellObjectCreator(REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
|
||||
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));
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize();
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
|
||||
|
||||
*ppv = result.Detach();
|
||||
hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
|
||||
|
||||
return S_OK;
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
return hResult;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
HRESULT inline ShellObjectCreatorInit(REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
CComPtr<IUnknown> result;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize();
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
|
||||
|
||||
*ppv = result.Detach();
|
||||
hResult = pobj->Initialize();
|
||||
|
||||
return S_OK;
|
||||
if (SUCCEEDED(hResult))
|
||||
hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
|
||||
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
return hResult;
|
||||
}
|
||||
|
||||
template<class T, class T1>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, ppv);
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize(initArg1);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
pobj->AddRef(); /* CreateInstance returns object with 0 ref count */
|
||||
|
||||
return S_OK;
|
||||
hResult = pobj->Initialize(initArg1);
|
||||
|
||||
if (SUCCEEDED(hResult))
|
||||
hResult = pobj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
|
||||
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
return hResult;
|
||||
}
|
||||
|
||||
template<class T, class T1, class T2>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, ppv);
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize(initArg1, 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<void **>(ppv));
|
||||
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
return hResult;
|
||||
}
|
||||
|
||||
template<class T, class T1, class T2, class T3>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, ppv);
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize(initArg1, 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<void **>(ppv));
|
||||
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
return hResult;
|
||||
}
|
||||
|
||||
template<class T, class T1, class R>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, R ** ppv)
|
||||
template<class T, class T1, class T2, class T3, class T4>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, void ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
CComPtr<R> result;
|
||||
HRESULT hResult;
|
||||
_CComObject<T> *pobj;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
|
||||
hResult = _CComObject<T>::CreateInstance(&pobj);
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
hResult = obj->Initialize(initArg1);
|
||||
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<void **>(ppv));
|
||||
|
||||
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;
|
||||
pobj->Release(); /* In case of failure the object will be released */
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
template<class T, class T1, class T2, class T3, class T4, class T5, class R>
|
||||
HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, T5 initArg5, REFIID riid, R ** ppv)
|
||||
{
|
||||
CComPtr<T> obj;
|
||||
CComPtr<R> result;
|
||||
HRESULT hResult;
|
||||
|
||||
if (ppv == NULL)
|
||||
return E_POINTER;
|
||||
*ppv = NULL;
|
||||
ATLTRY(obj = new _CComObject<T>);
|
||||
if (obj.p == NULL)
|
||||
return E_OUTOFMEMORY;
|
||||
hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(&result));
|
||||
if (FAILED(hResult))
|
||||
return hResult;
|
||||
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue