📄 shellfolder.cpp
字号:
//
// ShellFolder.cpp
//
#define INC_OLE2
#include <Windows.h>
#include <shlobj.h>
#include <tchar.h>
#include "QDrive.h"
#include "ShellFolder.h"
#include "ShellView.h"
#include "ContextMenu.h"
#include "ExtractIcon.h"
#include "DropTarget.h"
extern HINSTANCE g_hInstance;
extern UINT g_uiRefThisDll;
CShellFolder::CShellFolder(CShellFolder *pParent,
LPCITEMIDLIST pidl)
{
m_ulRef = 1;
g_uiRefThisDll++;
m_pPidlMgr = new CPidlMgr;
m_psfParent = pParent;
m_pidl = m_pPidlMgr->Copy(pidl);
m_pidlFQ = NULL;
m_pMalloc = NULL;
SHGetMalloc(&m_pMalloc);
}
CShellFolder::~CShellFolder()
{
g_uiRefThisDll--;
if(m_pidlFQ)
{
m_pPidlMgr->Delete(m_pidlFQ);
m_pidlFQ = NULL;
}
if(m_pMalloc)
{
m_pMalloc->Release();
}
delete m_pPidlMgr;
}
///////////////////////////////////////////////////////////
// IUnknown implementation
//
STDMETHODIMP CShellFolder::QueryInterface(REFIID riid,
LPVOID *ppReturn)
{
*ppReturn = NULL;
//IUnknown
if(IsEqualIID(riid, IID_IUnknown))
{
*ppReturn = this;
}
//IPersistFolder
else if(IsEqualIID(riid, IID_IPersistFolder))
{
*ppReturn = (IPersistFolder*)this;
}
//IShellFolder
else if(IsEqualIID(riid, IID_IShellFolder))
{
*ppReturn = (IShellFolder *)this;
}
if(*ppReturn)
{
(*(LPUNKNOWN*)ppReturn)->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(DWORD) CShellFolder::AddRef()
{
return ++m_ulRef;
}
STDMETHODIMP_(DWORD) CShellFolder::Release()
{
if(--m_ulRef == 0)
{
delete this;
return 0;
}
return m_ulRef;
}
///////////////////////////////////////////////////////////
// IPersist Implementation
STDMETHODIMP CShellFolder::GetClassID(LPCLSID lpClassID)
{
*lpClassID = CLSID_Shell_Extension_QDrive;
return S_OK;
}
///////////////////////////////////////////////////////////
// IPersistFolder Implementation
STDMETHODIMP CShellFolder::Initialize(LPCITEMIDLIST pidl)
{
if(m_pidlFQ)
{
m_pPidlMgr->Delete(m_pidlFQ);
m_pidlFQ = NULL;
}
m_pidlFQ = m_pPidlMgr->Copy(pidl);
return S_OK;
}
///////////////////////////////////////////////////////////
// IShellFolder Implementation
//
STDMETHODIMP CShellFolder::BindToObject(LPCITEMIDLIST pidl,
LPBC pbcReserved,
REFIID riid,
LPVOID *ppvOut)
{
*ppvOut = NULL;
CShellFolder *pShellFolder = new CShellFolder(this, pidl);
if(!pShellFolder)
{
return E_OUTOFMEMORY;
}
LPITEMIDLIST pidlFQ = m_pPidlMgr->Concatenate(m_pidlFQ, pidl);
pShellFolder->Initialize(pidlFQ);
m_pPidlMgr->Delete(pidlFQ);
HRESULT hr = pShellFolder->QueryInterface(riid, ppvOut);
pShellFolder->Release();
return hr;
}
STDMETHODIMP CShellFolder::BindToStorage(LPCITEMIDLIST pidl,
LPBC pbcReserved,
REFIID riid,
LPVOID *ppvOut)
{
*ppvOut = NULL;
return E_NOTIMPL;
}
STDMETHODIMP CShellFolder::CompareIDs( LPARAM lParam,
LPCITEMIDLIST pidl1,
LPCITEMIDLIST pidl2)
{
// TODO : Implement your own compare routine for pidl1 and pidl2
// Note that pidl1 and pidl2 may be fully qualified pidls, in which
// you shouldn't compare just the first items in the respective pidls
// Hint : Use lParam to determine whether to compare items or sub-items
// Return one of these:
// < 0 ; if pidl1 should precede pidl2
// > 0 ; if pidl1 should follow pidl2
// = 0 ; if pidl1 == pidl2
return 1;
}
STDMETHODIMP CShellFolder::CreateViewObject( HWND hwndOwner,
REFIID riid,
LPVOID *ppvOut)
{
HRESULT hr = E_NOTIMPL;
*ppvOut = NULL;
if (IsEqualIID (riid, IID_IShellView))
{
CShellView *pShellView;
pShellView = new CShellView(this, m_pidl);
if(!pShellView)
{
return E_OUTOFMEMORY;
}
hr = pShellView->QueryInterface(riid, ppvOut);
pShellView->Release();
return hr;
}
if(IsEqualIID(riid, IID_IContextMenu))
{
CContextMenu *pCM = new CContextMenu(this, 0, NULL);
if(pCM)
{
hr = pCM->QueryInterface(riid, ppvOut);
pCM->Release();
return hr;
}
}
if (IsEqualIID(riid, IID_IDropTarget))
{
CDropTarget *pDropTarget = new CDropTarget(this);
if (pDropTarget)
{
hr = pDropTarget->QueryInterface(IID_IDropTarget, ppvOut);
pDropTarget->Release();
return hr;
}
}
return hr;
}
STDMETHODIMP CShellFolder::EnumObjects( HWND hwndOwner,
DWORD dwFlags,
LPENUMIDLIST *ppEnumIDList)
{
HRESULT hr = E_OUTOFMEMORY;
*ppEnumIDList = NULL;
*ppEnumIDList = new CEnumIDList(this, m_pidl, dwFlags); // TODO : Add any addl. params as needed
if (NULL == *ppEnumIDList)
{
return hr;
}
return S_OK;
}
STDMETHODIMP CShellFolder::GetAttributesOf( UINT uCount,
LPCITEMIDLIST aPidls[],
LPDWORD pdwAttribs)
{
// TODO : Return appropriate ShellFolder attributes in pdwAttribs
// By default the following ORed value suffices.
//
*pdwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DROPTARGET;
return S_OK;
}
STDMETHODIMP CShellFolder::GetUIObjectOf( HWND hwndOwner,
UINT uCount,
LPCITEMIDLIST *aPidls,
REFIID riid,
LPUINT puReserved,
LPVOID *ppvReturn)
{
*ppvReturn = NULL;
if(IsEqualIID(riid, IID_IContextMenu))
{
CContextMenu *pCM = NULL;
if (m_pidl)
{
pCM = new CContextMenu(this, uCount, aPidls);
}
else
{
pCM = new CContextMenu(this, 0, NULL);
}
if(pCM)
{
HRESULT hr = pCM->QueryInterface(riid, ppvReturn);
pCM->Release();
return hr;
}
}
if (IsEqualIID(riid, IID_IExtractIcon))
{
CExtractIcon *pEI = new CExtractIcon(aPidls[0]);
if (pEI)
{
HRESULT hr = pEI->QueryInterface(riid, ppvReturn);
pEI->Release();
return hr;
}
}
return E_NOINTERFACE;
}
STDMETHODIMP CShellFolder::GetDisplayNameOf( LPCITEMIDLIST pidl,
DWORD dwFlags,
LPSTRRET lpName)
{
if (m_pMalloc == NULL)
{
return E_OUTOFMEMORY;
}
if (!lpName)
{
return E_INVALIDARG;
}
// TODO : Return the Display name by filling the STRRET strucuture
return E_NOTIMPL;
}
STDMETHODIMP CShellFolder::ParseDisplayName( HWND hwndOwner,
LPBC pbcReserved,
LPOLESTR lpDisplayName,
LPDWORD pdwEaten,
LPITEMIDLIST *pPidlNew,
LPDWORD pdwAttributes)
{
// TODO : Return the pidl associated with lpDisplayName
HRESULT hr = E_NOTIMPL;
return hr;
}
STDMETHODIMP CShellFolder::SetNameOf( HWND hwndOwner,
LPCITEMIDLIST pidl,
LPCOLESTR lpName,
DWORD dw,
LPITEMIDLIST *pPidlOut)
{
// TODO : Set the display name
return E_NOTIMPL;
}
//EOF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -