windows-nt/Source/XPSP1/NT/shell/osshell/lmui/shareui/dutil.cxx
2020-09-26 16:20:57 +08:00

120 lines
2.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1995.
//
// File: dutil.cxx
//
// Contents: Utility functions and macros for data objects
//
// History: 14-Dec-95 BruceFo Created
//
//----------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
#include "dutil.hxx"
LPIDA
DataObj_GetHIDA(
LPDATAOBJECT pdtobj,
STGMEDIUM* pmedium
)
{
FORMATETC fmte = {(CLIPFORMAT)g_cfHIDA, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
if (NULL != pmedium)
{
pmedium->pUnkForRelease = NULL;
pmedium->hGlobal = NULL;
}
if (NULL == pmedium)
{
if (SUCCEEDED(pdtobj->QueryGetData(&fmte)))
{
return (LPIDA)TRUE;
}
else
{
return (LPIDA)FALSE;
}
}
else if (SUCCEEDED(pdtobj->GetData(&fmte, pmedium)))
{
return (LPIDA)GlobalLock(pmedium->hGlobal);
}
return NULL;
}
VOID
HIDA_ReleaseStgMedium(
LPIDA pida,
STGMEDIUM* pmedium
)
{
if ((NULL != pmedium->hGlobal) && (pmedium->tymed==TYMED_HGLOBAL))
{
#if DBG == 1
if (NULL != pida)
{
LPIDA pidaT = (LPIDA)GlobalLock(pmedium->hGlobal);
appAssert(pidaT == pida);
GlobalUnlock(pmedium->hGlobal);
}
#endif
GlobalUnlock(pmedium->hGlobal);
}
else
{
appAssert(FALSE);
}
ReleaseStgMedium(pmedium);
}
LPITEMIDLIST*
ILA_Clone(
UINT cidl,
LPCITEMIDLIST* apidl
)
{
LPITEMIDLIST* aNewPidl = new LPITEMIDLIST[cidl];
if (NULL == aNewPidl)
{
return NULL;
}
for (UINT i = 0; i < cidl; i++)
{
aNewPidl[i] = ILClone(apidl[i]);
if (NULL == aNewPidl[i])
{
// delete what we've allocated so far
for (UINT j = 0; j < i; j++)
{
ILFree(aNewPidl[i]);
}
delete[] aNewPidl;
return NULL;
}
}
return aNewPidl;
}
VOID
ILA_Free(
UINT cidl,
LPITEMIDLIST* apidl
)
{
for (UINT i = 0; i < cidl; i++)
{
ILFree(apidl[i]);
}
delete[] apidl;
}