www.pudn.com > source.rar > Shell.cpp
// Shell.cpp: implementation of the CShell class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "flashnow.h"
#include "Shell.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
HIMAGELIST CShell::h_SmallImageList=NULL;
HIMAGELIST CShell::h_LargeImageList=NULL;
CImageList CShell::m_SmallImageList;
CImageList CShell::m_LargeImageList;
CShell::CShell()
{
m_ShowHidden=FALSE;
m_Building=FALSE;
}
CShell::~CShell()
{
if(h_SmallImageList)
{
m_SmallImageList.Detach();
h_SmallImageList=NULL;
}
if(h_LargeImageList)
{
m_LargeImageList.Detach();
h_LargeImageList=NULL;
}
}
CImageList * CShell::GetImageList(BOOL Small)
{
SHFILEINFO shFinfo;
if(!Small)
{
if(h_LargeImageList)
return &m_LargeImageList;
h_LargeImageList=(HIMAGELIST)SHGetFileInfo("C:\\",
0,
&shFinfo,
sizeof(shFinfo),
SHGFI_SYSICONINDEX |
SHGFI_LARGEICON);
if(!h_LargeImageList)
return NULL;
m_LargeImageList.Attach(h_LargeImageList);
return &m_LargeImageList;
}
else
{
if(h_SmallImageList)
return &m_SmallImageList;
h_SmallImageList=(HIMAGELIST)SHGetFileInfo("C:\\",
0,
&shFinfo,
sizeof(shFinfo),
SHGFI_SYSICONINDEX |
SHGFI_SMALLICON);
if(!h_SmallImageList)
return NULL;
m_SmallImageList.Attach(h_SmallImageList);
return &m_SmallImageList;
}
}
LPITEMIDLIST CShell::ConcatPidl(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
LPITEMIDLIST pidlNew;
UINT cb1;
UINT cb2;
if (pidl1)
cb1 = GetSize(pidl1) - sizeof(pidl1->mkid.cb);
else
cb1 = 0;
cb2 = GetSize(pidl2);
pidlNew = CreatePidl(cb1 + cb2);
if (pidlNew)
{
if (pidl1)
memcpy(pidlNew, pidl1, cb1);
memcpy(((LPTSTR)pidlNew) + cb1, pidl2, cb2);
}
return pidlNew;
}
LPITEMIDLIST CShell::CreatePidl(UINT cbSize)
{
LPMALLOC lpMalloc;
HRESULT hr;
LPITEMIDLIST pidl=NULL;
hr=SHGetMalloc(&lpMalloc);
if (FAILED(hr))
return 0;
pidl=(LPITEMIDLIST)lpMalloc->Alloc(cbSize);
if (pidl)
memset(pidl, 0, cbSize); // zero-init for external task alloc
if (lpMalloc) lpMalloc->Release();
return pidl;
}
LPITEMIDLIST CShell::CopyPidl(LPMALLOC lpMalloc, LPITEMIDLIST lpi)
{
LPITEMIDLIST lpiTemp;
lpiTemp=(LPITEMIDLIST)lpMalloc->Alloc(lpi->mkid.cb+sizeof(lpi->mkid.cb));
CopyMemory((PVOID)lpiTemp, (CONST VOID *)lpi, lpi->mkid.cb+sizeof(lpi->mkid.cb));
return lpiTemp;
}
UINT CShell::GetSize(LPCITEMIDLIST pidl)
{
UINT cbTotal = 0;
if (pidl)
{
cbTotal += sizeof(pidl->mkid.cb);
while (pidl->mkid.cb)
{
cbTotal += pidl->mkid.cb;
LPTSTR lpMem=(LPTSTR)pidl;
lpMem+=pidl->mkid.cb;
pidl = (LPITEMIDLIST)lpMem;
}
}
return cbTotal;
}
BOOL CShell::GetItemName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPTSTR lpFriendlyName)
{
BOOL bSuccess=TRUE;
STRRET str;
if (NOERROR==lpsf->GetDisplayNameOf(lpi,dwFlags, &str))
{
switch (str.uType)
{
case STRRET_WSTR:
WideCharToMultiByte(CP_ACP,
0,
str.pOleStr,
-1,
lpFriendlyName,
_MAX_PATH,
NULL,
NULL);
break;
case STRRET_OFFSET:
lstrcpy(lpFriendlyName, (LPTSTR)lpi+str.uOffset);
break;
case STRRET_CSTR:
lstrcpy(lpFriendlyName, (LPTSTR)str.cStr);
break;
default:
bSuccess = FALSE;
break;
}
}
else
bSuccess = FALSE;
return bSuccess;
}
int CShell::GetItemIcon(LPITEMIDLIST lpi, UINT uFlags)
{
SHFILEINFO sfi;
GetFileInfo(lpi,uFlags,&sfi);
return sfi.iIcon;
}
void CShell::ShowHidden(BOOL Hidden)
{
m_ShowHidden=Hidden;
}
void CShell::GetFileInfo(LPITEMIDLIST lpi, UINT uFlags, SHFILEINFO *psfi)
{
SHGetFileInfo((LPCSTR)lpi,
0,
psfi,
sizeof(SHFILEINFO),
uFlags);
}
int CShell::CompareStid(LPARAM lparam1, LPARAM lparam2)
{
CShellTreeItemData * pStid=(CShellTreeItemData *)lparam2;
return (short)CompareStid(lparam1,pStid->m_pIDList);
}
int CALLBACK CShell::SortProc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort)
{
return CompareStid(lparam1,lparam2);
}
int CShell::CompareStid(LPARAM lparam, LPCITEMIDLIST pIDList)
{
CShellTreeItemData * pStid=(CShellTreeItemData *)lparam;
HRESULT hr;
hr = pStid->m_pParentShellFolder->CompareIDs(0,pStid->m_pIDList,pIDList);
if (FAILED(hr))
return 0;
return (short)SCODE_CODE(GetScode(hr));
}
BOOL CShell::IsValidPath(CString Path)
{
Path+="*.*";
CFileFind Finder;
return Finder.FindFile(Path);
}
int CALLBACK CShell::Compare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
return 0;
}