windows-nt/Source/XPSP1/NT/shell/ext/cscui/idlhelp.cpp
2020-09-26 16:20:57 +08:00

102 lines
1.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: idlhelp.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include <shsemip.h> // ILFree(), etc
#include "idlhelp.h"
#include "folder.h"
HRESULT
IsOfflineFilesFolderID(
LPCITEMIDLIST pidl
)
{
LPITEMIDLIST pidlOfflineFilesFolder;
HRESULT hr = COfflineFilesFolder::CreateIDList(&pidlOfflineFilesFolder);
if (SUCCEEDED(hr))
{
if (ILIsEqual(pidlOfflineFilesFolder, pidl))
hr = S_OK;
else
hr = S_FALSE;
ILFree(pidlOfflineFilesFolder);
}
return hr;
}
HRESULT
BindToObject(
IShellFolder *psf,
REFIID riid,
LPCITEMIDLIST pidl,
void **ppvOut
)
{
HRESULT hr = NOERROR;
IShellFolder *psfRelease = NULL;
if (!psf)
{
hr = SHGetDesktopFolder(&psf);
if (SUCCEEDED(hr))
{
psfRelease = psf;
}
}
if (SUCCEEDED(hr))
{
if (!pidl || ILIsEmpty(pidl))
hr = psf->QueryInterface(riid, ppvOut);
else
hr = psf->BindToObject(pidl, NULL, riid, ppvOut);
}
if (psfRelease)
psfRelease->Release();
return hr;
}
HRESULT
BindToIDListParent(
LPCITEMIDLIST pidl,
REFIID riid,
void **ppv,
LPCITEMIDLIST *ppidlLast
)
{
HRESULT hr;
LPITEMIDLIST pidlParent = ILClone(pidl);
if (pidlParent)
{
ILRemoveLastID(pidlParent);
hr = ::BindToObject(NULL, riid, (LPCITEMIDLIST)pidlParent, ppv);
if (SUCCEEDED(hr))
{
if (ppidlLast)
*ppidlLast = ILFindLastID(pidl);
}
ILFree(pidlParent);
}
else
hr = E_OUTOFMEMORY;
return hr;
}