⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shellfolder.cpp

📁 Drive.dll is a dll that creates a drive to system directoryor drive similar to existing drives such
💻 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 + -